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
出力から除外されます。
答え2
変数名として文字を使用しないでください。l
数字に似ていて、1
コードが複雑になるからです。すでに知っているようにやりたいことは悪い考えですが見てください。https://mywiki.wooledge.org/DontReadLinesWithForシェルのファイルから行を読み、次のように書く方法を学びます。
while IFS= read -r regexp; do
sed -i "/$regexp/d" long-cluttered-filename.txt
done < delete-these-lines.txt
しかし、警告を受けたすべての理由でそれをしないでください(そしてgrep -v -f delete-these-lines.txt long-cluttered-filename.txt > tmp && mv tmp long-cluttered-filename.txt
効率が悪く、堅牢ではなく移植性が低いように再実装されます)。