テキストファイルに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'
します。したがって、これを追加し、期待される結果を提供してください。.com
print $1
.com
$1".com"
.com
答え3
非対話型内部ファイルを編集するための最良のツールはですex
。
ex -sc '%s/\(\.com\).*/\1/ | x' file.txt
vi
コロンで始まるコマンドを使用して入力したことがある場合は、:
exコマンドを使用しました。もちろん、この方法で実行できる高度なコマンドや「クール」コマンドの多くはVim拡張(例:bufdo
:)であり、Vimでは使用できません。POSIX仕様ex
しかし、これらの仕様は、非視覚的なテキスト編集(インタラクティブでもオートメーションでも)で本当に素晴らしいパフォーマンスと柔軟性を可能にします。
上記のコマンドはいくつかの部分で構成されています。
-s
ex
一括使用の準備をするには、サイレントモードを有効にしてください。 (出力メッセージ抑制など)
-c
file.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