正規表現を**使用しない**テキストファイル内の置換

正規表現を**使用しない**テキストファイル内の置換

テキストファイル内のテキストを置換文字列に置き換える必要があります。通常は次のようにします。

sed -i 's/text/replacement/g' path/to/the/file

問題は、 と はどちらも、ダッシュ、スラッシュ、ブラックスラッシュ、引用符などを含む複雑な文字列であることですtextreplacement内部の必要な文字をすべてエスケープすると、textすぐに判読不能になります。 一方、正規表現の力は必要ありません。テキストを文字通りに置換するだけで済みます。

テキスト置換を行う方法はありますかそれなしいくつかの bash コマンドで正規表現を使用するには?

これを実行するスクリプトを書くのはかなり簡単ですが、すでに何かが存在しているはずだと私は思います。

答え1

正規表現の力が必要ない場合は、使用しないでください。それは問題ありません。
しかし、これは実際には正規表現

sed 's|literal_pattern|replacement_string|g'

したがって、/それが問題である場合は、使用して|、前者から逃れる必要はありません。

PS: コメントについては、Stackoverflowの回答もご覧ください。sed検索パターンの文字列をエスケープする


アップデート: 使用に問題がない場合はパール試してみて、こんな感じに \Q\E

 perl -pe 's|\Qliteral_pattern\E|replacement_string|g'

@RedGrittyBrickもコメントで、より強力なPerl構文を使った同様のトリックを提案している。ここまたはここ

答え2

export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file

これは、ここでの唯一の 100% 安全な解決策です。その理由は次のとおりです。

  • これは正規表現ではなく静的な置換であり、何もエスケープする必要はありません(したがって、 を使用するよりも優れていますsed)。
  • 文字列に char が含まれていても壊れません}(したがって、提出された Perl ソリューションよりも優れています)
  • ENV['FIND']ではなく が使用されているため、どの文字でも分割されません$FIND$FINDまたは を Ruby コードにインラインで記述すると、文字列にエスケープされていない が含まれている場合に構文エラーが発生する可能性があります'

答え3

コマンドはreplaceこれを実行します。

翻訳元:

場所の変更:

replace text replacement -- path/to/the/file

stdout へ:

replace text replacement < path/to/the/file

例:

$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi

このreplaceコマンドは MySQL または MariaDB に付属しています。

答え4

\QPerlのメカニズムを使用して「引用符(無効)パターンメタ文字

perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'

関連情報