假设我有一个文件test.txt
,其中包含:
$foobar$
$
foobar
$
$
foobar$
$foobar
$
$
foo
bar
$
$
foo
bar$
$foo
bar
$
我希望每对$...$
替换为\(...\)
,...
可能包含新行。 修改:更准确地说,我希望有以下替代品:
\(foobar\)
\(
foobar
\)
\(
foobar\)
\(foobar
\)
\(
foo
bar
\)
\(
foo
bar\)
\(foo
bar
\)
以下sed
指令:
sed -e 's/\$\([^]]*\)\$/\\(\1\\)/g' test.txt
仅在没有任何新行的情况下完成工作。
另一种可能性是使用两遍:
$
\(
中的一个$
\)
替换为struct task_struct
但我不知道如何分辨“两个中的一个”。
答案 0 :(得分:6)
使用perl单行和flip-flop operator:
perl -pe 's/\$/\\(/ .. s/\$/\\)/' test.txt
答案 1 :(得分:2)
使用gnu-awk:
awk -v RS='\\$[^$]*\\$' 'RT{sub(/\$/, "\\(", RT); sub(/\$/, "\\)\n", RT); print RT}' file
\(foobar\)
\(
foobar
\)
\(
foobar\)
\(foobar
\)
\(
foo
bar
\)
\(
foo
bar\)
\(foo
bar
\)
答案 2 :(得分:1)
awk '{ while(/\$/) sub("\\$", ++c%2 ? "\\(" : "\\)" ) }1' file