我正在寻找一个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