我收到一些作者的文字,这些作家的字符串如下:string" string" string。
我希望它能读取字符串" string"字符串。
我尝试了各种各样的技巧但没有工作。
这是一次失败的尝试:
sed 's/.* "/.*"/g'
答案 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.
它查看引号数,每秒引号应该在文本后面。