以下を含む.txtファイルがあります。
ID VALUE
test value_1
testing value_2
first value_3
second value_4
与えられたIDに対応する行を削除するシェルスクリプトを作成しようとしています。たとえば、IDが「test」の行を削除したいので、フォーラムで次のように「sed」機能を使用できることがわかりました。
sed -i '/test/d' file.txt
ただし、この関数はIDが「testing」の行も削除します。これは、「test」という単語と複合しているためです。また、この関数は各行を検証するため、「test」という単語を含む値がある場合、その値も削除されます。
だから、
- IDが各行の先頭にある場合、ID列に「test」という単語のみを含むすべての行をどのように確認して削除できますか?また、単語で始まるすべての行をどのように確認して削除できるかを尋ねることもできます。 「テスト」?
- IDが「test」で「test」という単語が複合されていない場合にのみ削除する方法(この場合、「testing」は削除されます。)
- 「sed」機能は本当に十分でしょうか?
ありがとう
ベストアンサー1
または\b
\s
^
\b
単語の境界と一致し、行^
の先頭に一致します。
sed -i '/^test\b/d' file.txt
\b
列がスペースで区切られている場合は、\s
代わりにスペース文字の一致を検討してください。
十分ですsed
か?
はい。
以下は、コマンドラインテキスト処理の他の「一般的な容疑者」(ほとんど)への簡単な言及です。
または同様の目的で使用する場合もありますgrep
。特に、ファイルのコピーを処理したり、出力をリダイレクトしたり、出力を別のユーティリティにストリーミングしたりする場合には、さらにそうです。
grep -v '^test\b' file.txt
または、-w
単語の一致を使用します。
grep -vw '^test' file.txt
両方出力:
ID VALUE
testing value_2
first value_3
second value_4
高度なスクリプト言語を使用すると、他のより強力なオプションを使用できます。awk
良い中間オプションで、次のようにフォーム入力を処理するのに適しています。
awk 'NR > 1 && $1 != "test" { print $1,":",$2 }' test.txt
NR > 1
最初の行(ヘッダー行)をスキップし、$1 != "test"
正規表現の代わりに単純な文字列比較を使用します(同じように使用できます!/^test /
)。この{ print ... }
ブロックは、コロンで区切られた最初と2番目の列を印刷します(可能な内容のいくつかを示すために任意です)。
testing : value_2
first : value_3
second : value_4
したがって、awk
素晴らしい学習ツールです。その後、Perl、Pythonなどのプログラミング言語の全領域に入ります。シングルラインプログラムまたは大規模ソフトウェアスイートで使用できます。