sed 命令修复连接两个字符串文字

sed 命令修复连接两个字符串文字

我正在寻找一个sed(或其他 Unix 实用程序)命令来查找连接的两个字符串文字的所有实例,以便该命令将用两个字符串文字的相应组合替换这些连接。

具体来说,我正在尝试自动执行 Go 和 Java 源代码的这些编辑。

\"如果出现在任一字符串文字中,或者+出现在任一字符串文字中,则该命令不应中断。

该命令应处理字符前后任意数量的空白字符(或缺少空白字符)+

一些例子:

  • "foo" + "bar"=>"foobar"
  • "\"foo" + "bar"=>"\"foobar"
  • "foo"+"bar"=>"foobar"
  • "something else with " + "other words"=>"something else with other words"
  • a + "bar" + "baz" + c=>a + "barbaz" + c
  • "" + "bar" + "" + "foo"+ x=>"barfoo"+ x

(我不介意答案是否使用编程语言而不是 Unix 工具。)

答案1

可能是这样的:

sed -E '
  :1
    s/^(([^"]+|"(\\.|[^"\\])*")*"(\\.|[^"\\])*)"[[:blank:]]*\+[[:blank:]]*"/\1/
  t1'

在:

"foo" + "bar"
"\"foo" + "bar"
"foo"+"bar"
"something else with "    +   "other words"
"foo\"+" + "+" + "bar"
"1"+"\"+"+"2"

它给:

"foobar"
"\"foobar"
"foobar"
"something else with other words"
"foo\"++bar"
"1\"+2"

现在,如果我们必须处理任何 java 代码,那是不够的,您必须考虑"可能嵌入在注释中或在几行中添加'"'或在几行中添加内容,例如:

/*
   "-quoted strings ("A" + "B") have been converted to "AB"
*/
'"' // blah " + ""
c = '"'; s = "+"; c2 = '"';
f("foo" +
  "bar")

为了解决这些问题,您必须添加注释、'...'标记的匹配并以多行方式处理输入。可行,但比较复杂。

答案2

plus 的一种方法POSIX sed是利用 shell 变量使正则表达式组合易于处理。

#> one quoted chunk
qF='"
  \(
    [^\"]* \( [\]. [^\"]* \)*
  \)
"'

#> concatenate operator
plus='
  [[:blank:]]* [+] [[:blank:]]*
'

#> string add operation
add=" $qF $plus $qF "

#> de-whitespace regex
re=${add//[$IFS]/}

##> 
sed -e '
  :loop
    s/'"$re"'/"\1\3"/
  t loop
' file

输出:-

"foobar"
"\"foobar"
"foobar"
"something else with other words" 
a + "barbaz" + c
"barfoo"+ x

相关内容