Termuxでファイルを使用して複数行を置き換える方法

Termuxでファイルを使用して複数行を置き換える方法

私のディレクトリに次の内容のファイルがたくさんあるとしましょう*.txttexts

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam tincidunt mauris eu risus.
Vestibulum auctor dapibus neque.

私はそれを次に変えたい再帰的

Vestibulum commodo felis quis tortor.
Ut aliquam sollicitudin leo.
Cras iaculis ultricies nulla.
Donec quis dui at dolor tempor interdum.

これはかなり大きな交換だからです。 1つずつ入力するには時間がかかる場合があります。

だからそんなオプションがあればもっといいと思います。

コピーして貼り付ける元のテキストをファイルに配置し、必要original.txtな代替コンテンツを別のファイルに配置しますupdate.txt

その後、コマンドを実行してディレクトリ内のコンテンツで構成されている*.txtすべてのファイルを見つけてそのコンテンツに置き換えます。textsoriginal.txtupdate.txt

次の簡単な交換のようなものです。

find texts -name "*.txt" -exec sed -i 's/original/update/g' {} \;

これにより、手動で入力するのと同じエラーが発生せず、時間もかかりません。

しかし、これを達成するためにどのコマンドを使うべきかわかりません。可能ですか?

しかし、最初に元のテキストの可用性と出現回数を確認できる必要がありました。

次の簡単な検査のようになります。

cd texts
grep -r --color=always "original" | wc -l

ありがとうございます。

ベストアンサー1

私はsed(またはawk)の代わりにPerlを使います。

find texts/ -name '*.txt' \
  -exec perl -0777 -p -i.bak -e '
    BEGIN {
      $search = q{Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam tincidunt mauris eu risus.
Vestibulum auctor dapibus neque};

      $replace = q{Vestibulum commodo felis quis tortor.
Ut aliquam sollicitudin leo.
Cras iaculis ultricies nulla.
Donec quis dui at dolor tempor interdum.};
    };

    s/\Q$search\E/$replace/mg' {} +
  • -0777Perlに、ファイル全体を一度に「フルルック音を出し」、1つの長い文字列として処理するように指示します。

  • -pPerlが同様に動作するようにしますsed(そしてその-nオプションを使用すると同様に動作しますsed -n)。

  • -i.bakファイルを「所定の位置に」編集して、元の.bakファイルを拡張子として保存します。繰り返しますがsed -i

    バックアップコピーが必要ない場合は、-i代わりにjustを使用してください-i.bak

  • \QPerl正規表現は、正規表現特殊文字が含まれていても、次のパターン(aが表示されるまで\E)をリテラル文字列として扱うようにPerlに指示します。

    からman perlre

    \Q まで引用(無効)パターンメタ文字\E

    \E 最終ケースの修正または参照セクション

  • q{}q一重引用符とまったく同じPerl引用演算子を使用してください。これは、Perlスクリプトが一重引用符で囲まれた1行のコードで特に便利です(ここでバックスラッシュでエスケープできません。一重引用符内のエスケープコードは無視されるためです。man perlop「参照とクラス参照演算子」を確認して検索してください。また参照してくださいperldoc -f qperldoc -f qq二重引用符演算子と比較)。

ところで、単一のファイルでファイルのperl部分をテストし、出力を確認して、私が望むように動作することを確認することをお勧めします(つまり、findなし、特に何もありません-i.bak)。

おすすめ記事