Sed 修复文本中不正确的引号

Sed 修复文本中不正确的引号,sed,double-quotes,Sed,Double Quotes,我从一些作者那里收到的文本有一个字符串,比如:string“string”string 我想让它读字符串“字符串”字符串 我尝试过各种sed技巧,但都不管用 以下是一次失败的尝试: sed 's/.* "/.*"/g' 这可能适用于某些情况,但在报价不平衡时可能会失败: sed 's/"\([^"]*\S\)\s\s*"/"\1"/g' 如果缺少空格,则在引用短语后添加空格: sed -e 's/"\([^"]*\S\)\s\s*"/"\1"/g' -e 's/\("[^"]*"\)\([^

我从一些作者那里收到的文本有一个字符串,比如:string“string”string

我想让它读字符串“字符串”字符串

我尝试过各种sed技巧,但都不管用

以下是一次失败的尝试:

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

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

sed 's/"\([^"]*\S\)\s\s*"/"\1"/g'
如果缺少空格,则在引用短语后添加空格:

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

由于多种原因,您的尝试失败

通配符
*
将在字符串中消耗尽可能多的数据,这意味着它只允许发生一次替换(字符串中的最后一个双引号)

不能在替换部分使用
*
——替换的只是字符串,而不是正则表达式。处理“正则表达式匹配的任何部分”的方法是通过反向引用

所以这里有一个稍微不那么坏的尝试:

sed 's/"\([^"]*\) "/"\1"/g' file
这将找到一个双引号,然后找到并捕获任何不是双引号的内容,然后找到一个空格和一个双引号;并用双引号、第一个捕获的表达式(也称为backreference或backref)和另一个双引号替换整个匹配。这应该可以修复字符串中唯一的问题是在结束双引号内有许多空格,但在结束双引号后不缺少空格,在双引号或未配对双引号内也不缺少前导空格的字符串

之后的空间不足可以很容易地添加

sed 's/"\([^"]*\) " */"\1" /g;s/ $//' file
这将在每个结束双引号后添加一个空格,最后修剪行末尾的任何空格以修复此角案例

现在,您可以尝试更新前导空格的正则表达式,也可以使用类似的正则表达式对前导空格进行另一次传递。我会选择后一种方法,尽管前一种方法也是可行的(但需要更复杂的正则表达式,而且角落的情况更难记住)


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

这里是一个
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.

echo'string“string”string.|awk-F''''''{for(i=1;i-1描述您尝试了什么以及它是如何工作的。我尝试了sed's/*“/.*”/g'您是否也需要修复
string“string”string
类型的大小写(即引号内的前导空格)?您的输入中是否有不平衡的引号?是的,我有,但我想从一个案例开始不幸的是,解决方案会产生字符串“string”"字符串。我还应该补充一点,我愿意使用多个sed命令。我正在尝试创建一个sed脚本来修复提交文本中发现的各种字符串问题。是的。我已经使用sed很多年了,但只适用于一些琐碎的情况。请注意,一些
sed
方言要求捕获括号反斜杠,而其他方言则不允许使用是。如果这不起作用,请尝试在开始和结束括号之前删除反斜杠。上面的第二个示例很有效。非常感谢您的详细解释。我是一个新手,所以它不会让我投票赞成。此外,一些
sed
方言对分号作为命令分隔符不满意,但很乐意接受分号之间的换行符命令。许多方言还有一个
-e
选项,允许您以
-e
参数序列的形式编写脚本。有些事情没有手动干预是无法修复的,但以上三种情况都是对我的脚本的有价值的补充。非常感谢。
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.