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

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

テキストファイルに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削除された。

答え1

「.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

答え2

あなたはそれを使用することができますawkフィールド区切り記号(-F)は次のとおりです。

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
$ <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'します。したがって、これを追加し、期待される結果を提供してください。.comprint $1.com$1".com".com

答え3

非対話型内部ファイルを編集するための最良のツールはですex

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

viコロンで始まるコマンドを使用して入力したことがある場合は、:exコマンドを使用しました。もちろん、この方法で実行できる高度なコマンドや「クール」コマンドの多くはVim拡張(例:bufdo:)であり、Vimでは使用できません。POSIX仕様exしかし、これらの仕様は、非視覚的なテキスト編集(インタラクティブでもオートメーションでも)で本当に素晴らしいパフォーマンスと柔軟性を可能にします。

上記のコマンドはいくつかの部分で構成されています。

-sex一括使用の準備をするには、サイレントモードを有効にしてください。 (出力メッセージ抑制など)

-cfile.txtバッファー内のファイル(この場合)を開いた後に実行するコマンドを指定します。

%- と同じアドレス指定子です1,$。これは、次のコマンドがバッファ内のすべてのラインに適用されることを意味します。

sすでに慣れている可能性がある代替コマンドです。一般的に使用され、vi同じ内容を持っています。sコマンドsed、一部の高度な正規表現機能は実装ごとに異なる場合があります。この場合、「.com」から行末まで「.com」のみが置き換えられます。

垂直バーは、実行する順次コマンドを区別します。ほとんどのex実装では、次の追加オプションも使用できます-c

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

ただし、POSIXではこれを要求しません。

xファイルに変更が記録されると、コマンドは終了します。wq「書き込みと終了」とは異なり、ファイルxはバッファが編集されている場合にのみ書き込まれます。したがって、ファイルが変更されていない場合は、タイムスタンプが保存されます。

答え4

  • 文字列の後のすべての項目を削除
    sed 's/\.com.*/.com/'
    
    例:
    sed 's/\.com.*/.com/' filename >> filename
    
  • 単語の前のすべてのアイテムを削除
    sed 's/^.*can/can/' filename >> filename
    

関連情報