私は、接続されている2つの文字列リテラルのすべてのインスタンスを検索する(または他のUnixユーティリティ)コマンドを探しています。sed
これにより、コマンドはその接続を2つの文字列リテラルの対応する組み合わせに置き換えます。
特に私は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
プラスへの1つのアプローチPOSIX sed
は、シェル変数を利用して正規表現の組み合わせを扱いやすくすることです。
#> 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