sed搜索并替换“但不是\\”

时间:2015-11-30 22:36:06

标签: sed

我正在尝试用“”替换字符串中的所有转义字符\“但如果\”前面有\

所以输入如:

  • \“\”\“\”将返回“”“”“”“”“
  • \“\\”\“\”将返回“”\\“”“”“
  • \“将返回”“
  • \“\”将返回“”“”
  • \\“\”将返回\\“”“
  • \“\\”将返回“”\\“
  • \\\\\\\“将返回\\\\\\\”

到目前为止我已经

$ echo sed -e 's/\([^\]\)\\"/\1""/;s/^\\"/""/'

但是在

的情况下
$ echo '\"\"\"\"\"' | sed -e 's/\([^\]\)\\"/\1""/;s/^\\"/""/'` 

我的结果不正确。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed 's/\\\\"/\n/g;s/\\"/""/g;s/\n/\\\\"/g' file

用其他东西替换你想要触及的字符串的所有出现(\n是一个不错的选择),替换你想要全局改变的字符串,恢复第一组字符串。

答案 1 :(得分:0)

这个怎么样:

#!/bin/bash

function myreplace {
    echo "$1" | sed -e "s/[\\]\"/MYDUMMY/g" \
                    -e 's/\\MYDUMMY/\\\\"/g' \
                    -e 's/MYDUMMY/""/g'
}

myreplace '\"\"\"\"'
myreplace '\"\\"\"\"'
myreplace '\"'
myreplace '\"\"' 
myreplace '\\"\"' 
myreplace '\"\\"' 
myreplace '\\\\\\\"'

执行上述脚本会导致:

""""""""
""\\"""""
""
""""
\\"""
""\\"
\\\\\\\"

答案 2 :(得分:0)

使用sed循环将不必为未知数据集选择唯一的替换字符串。

sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'


$ echo '\"\"\"\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g;t inner'
""""""""
$ echo '\"\\"\"\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'
""\\"""""
$ echo '\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'
""
$ echo '\"\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'
""""
$ echo '\\"\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'
\\"""
$ echo '\"\\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'
""\\"
$ echo '\\\\\\\"' | sed -e 's/^\\"/""/;:inner; s/\([^\]\)[\]"/\1""/g; t inner'
\\\\\\\"