sedの

2017-10-18 9 views
0

問題の変数に特定の文字を検索と置換:私は、変数sedの

例に保存されている同じ文字列内に別の文字を付加したい文字の変数を持っています。 "[blahblahblah]" ---> "\ [blahblahblah \]"

現在のソリューション:現在、私は、各ステップは、1つのブラケットを攻撃、私は2つのステップで何をしたい達成

例。

temp=[blahblahblah] 
firstEscaped=$(echo $temp | sed s#'\['#'\\['#g) 
fullyEscaped=$(echo $firstEscaped | sed s#'\]'#'\\]'#g) 

これは私が欲しい結果を与えるが、私はcapturing groupsを使用して1行でこれを達成することができるような気がします。私はちょうど運がなかったし、私は燃えてきている。私がやっていることではなく、角括弧で囲まれたテキストを抽出したいと思っている例がほとんどです。 Thisは私の最近の役に立たない試みです。何か案は?

答えて

3

出力

\[blahblahblah\] 

あり、より効率的な方法、(手の込んだREG-EXでのみ1 s/s/r/)であってもよいが、これは動作しますが、あなたのサンプル入力与え

fully=$(echo "$temp" | sed 's/\([[]\)/\\\1/;s/\([]]\)/\\\1/') ; echo "$fully" 

こと。なお、複数のsed操作を連鎖させて、;で区切ってください。または、sedスクリプトファイルの場合は、空白行で区切ります。

sedキャプチャグループについては、\(...\)のペアを使用し、数値で参照すると、つまり\1となります。

IHTH

2
$ temp=[blahblahblah]  
$ fully=$(echo "$temp" |sed 's/\[\|\]/\\&/g'); echo "$fully" 
\[blahblahblah\] 

簡単な説明、

  • \[\|\]:ターゲット代替に '[' または ']'、および '['、 ']' のために、そして '|'エスケープする必要があります。
  • &:一致したパターンを参照する文字は&であり、それもエスケープする必要があることを覚えておいてください。 @Gordon Davissonの提案として

、あなたはまた、拡張フォーマットの正規表現を避けるために、ブラケット表現を使用することができ、

sed 's/[][]/\\&/g' 
+1

あなたは単語の分割とワイルドカード拡大を防ぐために、二重引用符 '$のtemp'に必要です。 '[]'はシェルワイルドカードなので、予期せず展開される可能性があることに注意してください。 –

+0

はい、そうです。これはOPからコピーされ、これを修正します。 – CWLiu

+1

私はあなたが使用している正規表現が拡張フォーマットであることに気付きました( '|'を使って別のものを区切ります)。これは 'sed -r'(GNU sed)や' sed -E'(BSD sed)を使用しない限り一般的にはうまくいかないでしょう。おそらく大括弧の式を使うほうがいいでしょう(大括弧を含む括弧の式は複雑ですが)。 'sed 's/[] []/\\&/ g''は動作するはずです。 –