修复文本中不正确的引号

时间:2014-08-11 05:36:17

标签: sed double-quotes

我收到一些作者的文字,这些作家的字符串如下:string" string" string。

我希望它能读取字符串" string"字符串。

我尝试了各种各样的技巧但没有工作。

这是一次失败的尝试:

sed 's/.* "/.*"/g'

3 个答案:

答案 0 :(得分:1)

您的尝试因多种原因而失败。

通配符.*将尽可能多地消耗字符串,这意味着它只会允许单个替换发生(字符串中的最后双引号)。

您无法在替换部分中使用.* - 您使用替换只是一个字符串,而不是正则表达式。处理"正则表达式匹配的任何(部分)"是通过反向引用。

所以这是一个稍微破碎的尝试:

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

这会找到一个双引号,然后找到并捕获任何不是双引号的东西,然后找到一个空格和一个双引号;并用双引号替换整个匹配,第一个捕获的表达式(也称为后引用或backref),以及另一个双引号。这应该修复字符串,其中唯一的问题是结束双引号内的多个空格,但在结束双引号后不会丢失空格,也不会在双引号或不成对的双引号内带有前导空格的字符串。

之后可以轻松添加空格;

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

这将在每个结束双引号后添加一个空格,最后修剪行尾的任何空格以修复此角点情况。

现在,您可以尝试更新前导空格的正则表达式,或者只使用类似的正则表达式进行另一次传递。我会采用后一种方法,即使前者也是可行的(但需要更复杂的正则表达式,并且角落情况更难以保留在你的脑海中)。

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

对于带有不平衡双引号的输入,这仍然会失败,无论如何都几乎不可能完全自动处理(如何假设在哪里添加缺少的双引号?)

答案 1 :(得分:0)

这可能适用于某些情况,但可能会因报价不平衡而失败:

sed 's/"\([^"]*\S\)\s\s*"/"\1"/g'
如果空格丢失,

还会在引用的短语后添加空格:

sed -e 's/"\([^"]*\S\)\s\s*"/"\1"/g' -e 's/\("[^"]*"\)\([^"]\)/\1 \2/g'

答案 2 :(得分:0)

以下是awk解决方案:

echo 'string "string "string.' | awk -F' "' '{for (i=1;i<=NF;i++) printf (i%2==0?"\"":"")"%s"(i%2==0?"\"":"")(i!=NF?" ":""),$i;print ""}'
string "string" string.

它查看引号数,每秒引号应该在文本后面。