テキストファイル内のテキストを置換文字列に置き換える必要があります。通常は次のようにします。
sed -i 's/text/replacement/g' path/to/the/file
問題は、 と はどちらも、ダッシュ、スラッシュ、ブラックスラッシュ、引用符などを含む複雑な文字列であることですtext
。replacement
内部の必要な文字をすべてエスケープすると、text
すぐに判読不能になります。 一方、正規表現の力は必要ありません。テキストを文字通りに置換するだけで済みます。
テキスト置換を行う方法はありますかそれなしいくつかの bash コマンドで正規表現を使用するには?
これを実行するスクリプトを書くのはかなり簡単ですが、すでに何かが存在しているはずだと私は思います。
答え1
正規表現の力が必要ない場合は、使用しないでください。それは問題ありません。
しかし、これは実際には正規表現。
sed 's|literal_pattern|replacement_string|g'
したがって、/
それが問題である場合は、使用して|
、前者から逃れる必要はありません。
PS: コメントについては、Stackoverflowの回答もご覧ください。sed検索パターンの文字列をエスケープする。
アップデート: 使用に問題がない場合はパール試してみて、こんな感じに \Q
。\E
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
答え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
\Q
Perlのメカニズムを使用して「引用符(無効)パターンメタ文字「
perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'