如何用可能的换行符替换成对的令牌?

时间:2015-11-23 07:20:48

标签: regex perl awk sed tr

假设我有一个文件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

仅在没有任何新行的情况下完成工作。

另一种可能性是使用两遍:

  1. 第一个用$
  2. 替换一个\(中的一个$
  3. 第二个将所有剩余的\)替换为struct task_struct
  4. 但我不知道如何分辨“两个中的一个”。

3 个答案:

答案 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