各代替の前にsedに私に確認を依頼する方法はありますか? vimで置換を使用するときは「c」に似ています。
sedは本当にこのようなことをしますか?
ベストアンサー1
sed
非対話型フローエディタであるため、使用できない場合があります。これをsed
スクリプトにカプセル化するには、あまりにも多くの考えが必要です。これを行う方が簡単ですvim
。
vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' file.in
以下の説明で説明されているので、特定のファイル名ワイルドカードパターンと一致する現在のディレクトリ内の複数のファイルにこれを使用する方法は次のとおりです。
for fname in file*.txt; do
vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' "$fname"
done
または、置換を実行する前に、ファイルに指定されたパターンに一致する行が実際に含まれていることを確認するには、次の手順を実行します。
for fname in file*.txt; do
grep -q 'PATTERN' "$fname" &&
vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' "$fname"
done
上記の2つのシェルループは同じ操作を実行するコマンドを持つように変更されましたが、特定のfind
ディレクトリ内またはその下にtop-dir
特定の名前を持つすべてのファイルについて
find top-dir -type f -name 'file*.txt' \
-exec vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' {} \;
find top-dir -type f -name 'file*.txt' \
-exec grep -q 'PATTERN' {} \; \
-exec vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' {} \;
または、raw シェルループを使用し、find
ここにパス名を追加します。
find top-dir -type f -name 'file*.txt' -exec sh -c '
for pathname do
vim -c "%s/PATTERN/REPLACEMENT/gc" -c "wq" "$pathname"
done' sh {} +
find top-dir -type f -name 'file*.txt' -exec sh -c '
for pathname do
grep -q "PATTERN" "$pathname" &&
vim -c "%s/PATTERN/REPLACEMENT/gc" -c "wq" "$pathname"
done' sh {} +
とにかくあなたはそうですいいえ似たようなfor filename in $( grep -rl ... )
ことをしたい
grep
これはループの最初の反復を開始する前に完了する必要があります。つまり、優雅ではないと- 返されたパス名は
grep
空白の単語に分割され、これらの単語はファイル名のグロービング(スペースと特殊文字を含むパス名を抑制する)を経ます。
関連: