特別なテキストをsedに置き換えますか?


3


私はWindows XPでCMDを使って特殊テキストをSedに置き換えています。私はこのような特殊文字を置き換えるためにこのコマンドを使用しています $ or *

sed -i "s/\*/123/g;" 1.txt

しかし、どのように私はこの文字列を置き換えるために使用する必要があります ciao! 私のテキストファイルに?可能です?

\\
\\\
""
sed.exe -i "s/{\*)(//123/
sed -i "s/\\/123/g;" 1.txt

私が持っているので前のコマンドは動作しません \" そしてsedが正規表現を作るのに使うその他の特別な文字列


ソース文字列と目的のターゲット文字列の例を教えてください。例えば: 回したい */123"ciao!"
Synetech

私は向きを変えたい sed -i^/\\*$/$[{" ;" 1.txtCiao!
user143822

ソース文字列に実際のsedを含めるようにします。 コマンド o.O
Synetech

はい、私は私のテキストファイルに特別な文字列でsedコマンドを置き換えたいです。
user143822

質問に "sed"がまったくありませんでした。 "123"を使用しました。ソース文字列を実際の例の文字列に置き換えるように質問を編集してください。
Synetech

回答:


5

探している リテラル 検索文字列に特殊文字が含まれている場合、正規表現を使用した文字列は、パターンを検索するほど単純ではない場合がありますが、少し手を加えることでそれを実行できます。

注: echo コマンドはCMD特殊文字に対応しなければならないので、それは必要です ^^ シングルを脱出する ^ そして ^| 脱出する | ... CMDのエスケープ文字は必要ありません ^ ファイルに直接入力した場合


ステップ1: という名前のファイルを作成します。 literal-srch-strings.txt 置き換えられる正確な(変更されていない)文字列を含みます。このファイルを作成する方法は2つあります。

  1. CMDで発行されたコマンドとして コマンドライン または、.cmd / .bat内のコマンドとして コマンドスクリプト

    echo sed -i^^/\\*$/$[{" ;"> literal-srch-strings.txt

  2. 作る literal-srch-strings.txt あなた自身、あなたのテキストエディタで。
    この場合、あなたは いけない CMDエスケープ文字を使用 ^だから、行は1つだけです ^ではない ^^ - これはCMDシェルを迂回しているためです。
    これは.txtファイルに必要なものです(ファイル名が言うとおり):)

    sed -i^/\\*$/$[{" ;"


ステップ2: 作る sedスクリプト 、という名前 str-to-regex.sed 、文字列をsedの正規表現に変換します。
CMD-escape-characterの同じ問題に注意してください。 ^ この手順に適用されるので、.sedファイルを作成する方法は2つあります。

  1. コマンドとして:

    echo s/[]\/$*.^^^|[]/\\^&/g; s/.*/s\/^&\/Ciao!\/g/> str-to-regex.sed

  2. テキストエディタを使って、という名前のファイルを作ります。 str-to-regex.sed 、を含む:

    s/[]\/$*.^|[]/\\&/g; s/.*/s\/&\/Ciao!\/g/


ステップ3: 実行します sedスクリプト 文字列をsedの正規表現に変換します。
その出力を別のsedスクリプトに送る replace-text.sed 、それは実際の置き換えになります。

sed -f str-to-regex.sed  literal-srch-strings.txt > replace-text.sed

ステップ4: 実行する replace-text.sed - 私達が使用できるテストのために literal-srch-strings.txt 入力ファイルとして使用できますが、もちろん任意の入力ファイルを使用できます。

sed -f replace-text.sed  literal-srch-strings.txt

これが出力です。

Ciao! 

非常に難しい。私もそうしよう - > echo '"{*)(// 123 / $$' sed -i" s / [\ "] [{] [\\] [*] [)] [(] [/] [/] 123 [/] [$] [$] / xx / "1.txt
user143822

1
あなたの例はトリッキーなパターンなので難しいです。それを感じるようになれば、それほど難しいことではありませんが、このようなテキストをジャグリングすることは、CMDシェルよりもbashシェルの方が簡単であることがわかるかもしれません。 cygwin (CMDに似たウィンドウが表示されますが、実行されます。 bash どちらですか ずっと CMDよりも柔軟性があります。
Peter.O

ピーター、私はあなたのステップに従うことを試みるが、私はいくつかの間違いを犯した、私は私を助けることができる?私のビデオを見てください nathan3000.altervista.org/Test_Vari/sedx.htm
user143822

ご了承ください ステップ2 対応します 任意の入力文字列 (あなたの例の文字列だけではありません)...しかしあなたがあなたの中でこれらの3つの文字のどれかを使うならば 置換文字列 &/\​、あなたはそれらをエスケープする必要があります \&\/\\​ それぞれ。
Peter.O

返信いただきありがとうございます。今すぐ試してみますが、まだ問題があります。 CMDコマンドを使用する:at echo s /[]\/$*.^^^ | [] / \\& / g; s /.*/ s \ / ^& \ / Ciao!\ // g> str-to-regex.sed cmdは私にエラーを出します: '/ g'は内部コマンドまたは外部コマンドとして認識されません 。両方の方法(cmdと手動でファイルを作成する)を使って sed -f文字列から正規表現への変換リテラル文字列.txt> replace-text.sed cmdは私にこのエラーを出します sed:ファイルstr-to-regex.sedの1行目:終端されていない 's'コマンド
user143822

0

コマンドライン(またはバッチファイル内の行)の特殊文字の意味を上書きするには、^(カラット)文字を使用してそれらをエスケープします。文字通りのカラット文字を入力するには、2つを続けて使用します。


このような置換文字列の正確なコマンドは何ですか sed.exe -i "s/{\*)(//123/$$
user143822

@ user143822:私はバックスラッシュとドル記号から始めます(あなたのコメントにあるように、引用が単なる独立したものではないと仮定します、もしそうなら、それもそうです)。
martineau

mmm..theコマンドはこれ? sed.exe -i "/{^\*)(//123/^$^$ ?区切り文字を@に置き換えても動作しません sed -i "s@sed.exe -i "/{^\*)(//123/^$^$@Ciao!@g; 1.txt
user143822

1
@ user143822:試してください ^"{^\*)(//123/^$^$。あなたも試すことができます echo 何を見逃しているのかのアイデアを得るために使用しようとしているものは何でも。
martineau

@ user143822:sedに渡したいものすべてに引用符を付ける必要があるかもしれません。 "^"{^\*)(//123/^$^$"
martineau
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.