web-dev-qa-db-ja.com

ファイル内の特定のパターンまたは文字列の後の各行の残りを削除する方法は?

テキストファイルにURLのリストがあるとします。

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

「.com」以降のすべてを削除したい。

予期された結果:

google.com
unix.stackexchange.com
isuckatunix.com

私は試した

sed 's/.com*//' file.txt 

削除されました.com 同様に。

22
Koshur

「.com」以降のすべてを明示的に削除するには、既存のsedソリューションを調整して、「。com(anything)」を「.com」に置き換えます。

sed 's/\.com.*/.com/' file.txt

私はあなたの正規表現を最初の期間から逃れるために微調整しました。それ以外の場合は、「thisiscommon.com/something」のようなものと一致します。

「sub.com.domain.com/foo」のようなものを誤って削除しないように、末尾のスラッシュで「.com」パターンをさらにアンカーしたい場合があることに注意してください。

sed 's/\.com\/.*/.com/' file.txt
20
Jeff Schaller

awk のフィールド区切り文字(-F)を次のように使用できます。

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

説明:

NAME
       awk - pattern scanning and processing language
-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

.comの後のすべてのものを削除したいので、-F '.com'.comで行を区切り、print $1.comの前の部分のみを出力します。したがって、$1".com".comを追加し、期待どおりの出力を提供します。

9
Pandya

とても速くてシンプルで汚いpython方法:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

サンプル実行

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
2