ある時点でファイルを取得し、その中の特定の単語を検索し、この単語の後に続くテキスト全体 (単語自体を含む) を削除する必要があるシェル スクリプトを作成しています。awk は適切なツールだと思います。しかし、私はプログラミングについてあまり知りません。
誰でも私を助けることができますか?
「awk」はこの仕事のためのツールの 1 つだと思いますが、この特定の操作には「sed」の方が簡単だと思います。仕様は少し曖昧です。簡単なバージョンは次のとおりです。
そのためには、「sed」を使用します。
sed '/word/,$d' file
より複雑なバージョンは次のとおりです。
私はおそらくまだ「sed」を使用します:
sed -n '1,/word/{s/word.*//;p}' file
これは論理を反転させます。デフォルトでは何も出力しませんが、1 行目から単語を含む最初の行までは置換を行い (単語を含む行までは何もしません)、次に出力します。
「awk」で実行できますか?「awk」は入力行を単語に自動分割し、関数を使用して置換を行う必要があるため、完全に自明ではありません。
awk '/word/ { if (found == 0) {
# First line with word
sub("word.*", "")
print $0;
found = 1
}
}
{ if (found == 0) print $0; }' file
(編集:「削除」は「awk」の予約語であるため、「削除」を「見つかった」に変更します。)
これらのすべての例では、入力ファイルの切り詰められたバージョンが標準出力に書き込まれます。その場でファイルを変更するには、Perl、Python、または同様の言語を使用するか、コマンドの完了後に元のファイルにコピーする一時ファイルに出力をキャプチャする必要があります。(「スクリプト ファイル」を試すと、空のファイルが処理されます。)
sed および awk スクリプトに適用できるさまざまな早期終了の最適化があります。たとえば、次のとおりです。
sed '/word/q' file
また、awk または sed の GNU バージョンの使用を想定している場合、ファイルのその場での変更に役立つさまざまな非標準の拡張機能があります。
あなたの入力は次のようなものだと思います:
Lorem ipsum dolor sit amet,
consectetur adipiscing velit.
Nullam neque sapien、molestie vel congue non、
feugiat quis tellus. Ut quis
nulla mi. Maecenas a ligula。
'vel'
そして、次のように単語で出力を切り捨てたいとします:
Lorem ipsum dolor sit amet,
consectetur adipiscing velit.
Nullam neque sapien、痴漢
その場合、awk スクリプトは次のようになります。
cat lorem.txt | awk '
/\<vel\>/
{
print substr($0, 0, match($0, /\<vel\>/) - 1);
exit;
}
{ print }
'
vel
切り取る単語は、スクリプト内の単語の両方のインスタンスを置き換える必要があります。
スクリプト全体を 1 行に安全に配置することもできます。
awk で行う方法はわかりませんが、sed で行うことができます。
sed -i~ -e 's/the-word-to-find.*$//' the-file
the-word-to-find
これにより、 を含むすべての行で、行末までのすべてが削除されますthe-word-to-find
。が最初に出現したときに残りのファイルを削除する場合はthe-word-to-find
、次のようにします。
sed -i~ -e 's/\(the-word-to-find\).*$/\1/;/the-word-to-find/,$d'
この awk ワンライナーでうまくいくはずです: { sub(/ word.*/, ""); すべての行について、その行に単語 (スペースが続く) で始まり行末まで続くパターンが含まれている場合、そのパターンを空の文字列に置き換えてから、更新された行を出力します。
[質問はどちらの方法でも読めると考えました(その行のテキスト全体またはファイル内のテキスト全体)。ファイルの残りをスキップしたい場合は、次のようにします。 { skip = gsub(/ word.*/, ""); 印刷します。if (スキップ) 終了 } ]
sed で行の一部を削除するには、例えば:
$ echo '12345 John Smith / red black or blue it is a test' | sed -e 's/\/.*//'
$ 12345 John Smith