如果我有一个像下面这样的字符串
"firstname surname"""
如何删除所有内部双引号但保留周围引号。
我想保留周围的原因是因为该字符串包含一个逗号,并且不希望将其作为 CSV 中的新列
我试过使用
echo '"firstname surname"""' | sed -e "s/\"\"\+/ /g"
但总是删除结束双引号。
这是 perl 命令行比 sed 更适合的一种情况,因为以下内容不支持环视sed
:
s='"firstname surname"foo"bar"'
echo "$s"| perl -pe 's/(?!^)"(?!$)//g'
"firstname surnamefoobar"
你可以这样做:
$ echo '"firstname surname"""' | sed -e 's/["]["]//g'
"firstname surname"
使用awk
echo '"firstname surname"""' | awk '{gsub(/""/,x)}1'
"firstname surname"
也许这太 sed 了,但我是这样的:
$ echo '"firstname surname"""' | sed -e 's/^"/@/' -e 's/"$/@/' -e 's/"//g' -e 's/@/"/g'
"firstname surname"
这会删除"
前导和关闭之间的所有内容"
:
$ echo '"firstn"ame "surname"""' | sed -e 's/^"/@/' -e 's/"$/@/' -e 's/"//g' -e 's/@/"/g'
"firstname surname"
sed -e 's/^"/@/' -e 's/"$/@/' -e 's/"//g' -e 's/@/"/g'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^
replace leading and closing " with @ delete all " set @ back to "
sed 's/["]\{2,\}/"/g'
将所有出现的多于 1 个 " (the ["]\{2,\}
) 的事件仅删除一个 "。它也可以用于周围引号不是要处理的完整字符串的第一个和最后一个字符的情况。
如果只是外部报价保持公正
sed 's/^[^"].*[^"]$/&/;t;s/^"\(.*\)"$/\1/;s/"//g;s/.*/"&"/'
这也确保了我们不会为没有被引号包围的字符串修改 "
如果您将引用的字符串放入另一个上下文中,只需给我们一个示例(特别是分隔符信息)
这可能对您有用(GNU sed):
sed -r ':a;s/^("[^"]*)"(.*")$/\1\2/;ta' file
或者:
sed 's/"//g;s/.*/"&"/' file