シェル *for* はファイルを繰り返し、各行ごとに sed を使用して他のファイルから行を削除します。

シェル *for* はファイルを繰り返し、各行ごとに sed を使用して他のファイルから行を削除します。

long-cluttered-filename.txt文字列に一致する行を削除して整理しようとしていますdelete-these-lines.txt...

$ cat delete-these-lines.txt
context
platform
server
civicrm
site_enabled
client
redirection
cron_key
^\s*[0-9]*\s
alias
profile
install
ssl_
address

...単純なforループを使用すると、次のようにそのファイルの行を繰り返すことができます。

$ for l in delete-these-lines.txt; do cat $l; done
context
platform
server
civicrm
site_enabled
client
redirection
cron_key
^\s*[0-9]*\s
alias
profile
install
ssl_
address

ところで交換しようとしたらうまくcatいかないですねsed。次のいずれも機能しません。

for l in delete-these-lines.txt; do sed -i "/$l/d" long-cluttered-filename.txt; done
for l in delete-these-lines.txt; do sed -i '/"$l"/d' long-cluttered-filename.txt; done

$l変数の補間に問題がありますか?これはforループの制限ですか?

同様の答えを見ましたテキストファイルの文字列リストに指定された文字列行を削除するには、sedを繰り返します。そしてファイルから行を読み取って削除するwhileループを使用しますreadが、可能であればループを使用することをお勧めしますfor。そうでない場合は、理由を知りたいです。

ベストアンサー1

2つのファイルがあり、1つに別のファイルから削除したい文字列のリストが含まれている場合は、次の簡単な操作ですべての操作を実行できますgrep

grep -v -f delete-these-lines.txt long-cluttered-filename.txt

long-cluttered-filename.txtこれにより、パターンと一致しないすべての文字列が出力されますdelete-these-lines.txt

long-cluttered-filename.txtの一部の文字列に含まれている場合client(たとえば123superclient456)、まだ一致し、client出力から除外されます。

おすすめ記事