sed替换两个双引号并保留文本

时间:2017-09-29 12:24:13

标签: bash sed replace

要处理的文字:

""text""
"text"
""

所需的输出:

"text"
"text"
""

试过:

 echo -e '""text""\n"text"\n""' | sed -e 's/"".*""/".*"/g'

但显然没有运气。

干杯,

7 个答案:

答案 0 :(得分:2)

根据您的示例输入,您可以使用:

sed '/^""$/! s/""/"/g' file

在不仅包含两个双引号的行上,全局用一个双引号替换所有双引号对。

答案 1 :(得分:1)

$ sed 's/"\("[^"]*"\)"/\1/' file
"text"
"text"
""

答案 2 :(得分:0)

您希望在sed命令中使用反向引用(引用先前匹配的部分):

echo -e '""text""\n"text"\n""' | sed -E -e 's/""(.*)""/"\1"/g'

以下是我所做的修改:

  • 我将匹配模式中双引号内的内容与(...)
  • 分组
  • 我在替换模式中使用\1
  • 引用了匹配组
  • 我告诉sed使用-E xtended regex所以我不必逃避分组括号

答案 3 :(得分:0)

请问您可以尝试按照awk命令告诉我这是否对您有帮助。

awk -v s1="\"" '!/^\"\"$/{gsub(/\"\"/,s1)} 1'  Input_file

答案 4 :(得分:0)

另一种方法

cat file | sed 's/"//g' | sed 's/^/"/g' | sed 's/$/"/g'

<强>详情

sed 's/"//g'删除所有双引号

sed 's/^/"/g'在每行的开头加上双引号

sed 's/$/"/g'在每行末尾加上双引号

注意

只有每行有一个单词时,此方法才有效,如您的示例所示。

答案 5 :(得分:-1)

Aaron的答案也很好,但反向引用一般来说更贵。为什么不使用更简单的命令:

echo -e '""text""\n"text"\n""' | sed 's/""*/"/g'

正则表达式将多个双引号替换为单引号。

答案 6 :(得分:-1)

echo -e '""text""\n"text"\n""' |awk '/""text""/{gsub(/""/,"\42")}1'

"text"
"text"
""