各代替の前にsedに確認を依頼してもよろしいですか?

各代替の前にsedに確認を依頼してもよろしいですか?

各代替の前に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 ... )ことをしたい

  1. grepこれはループの最初の反復を開始する前に完了する必要があります。つまり、優雅ではない
  2. 返されたパス名はgrep空白の単語に分割され、これらの単語はファイル名のグロービング(スペースと特殊文字を含むパス名を抑制する)を経ます。

関連:

おすすめ記事