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

Den*_*uzé 1 regex perl awk sed tr

假设我有一个文件test.txt,包含:

$foobar$

$
foobar
$

$
foobar$

$foobar
$

$
foo
bar
$

$
foo
bar$

$foo
bar
$
Run Code Online (Sandbox Code Playgroud)

我希望每一对$...$都被替换\(...\),...可能包含新的线条.编辑:更确切地说,我希望以下替换:

\(foobar\)

\(
foobar
\)

\(
foobar\)

\(foobar
\)

\(
foo
bar
\)

\(
foo
bar\)

\(foo
bar
\)
Run Code Online (Sandbox Code Playgroud)

以下sed说明:

sed -e 's/\$\([^]]*\)\$/\\(\1\\)/g' test.txt
Run Code Online (Sandbox Code Playgroud)

只有在没有新线的情况下才能完成工作.

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

  1. 第一个替换$为两个中的一个\(
  2. 第二个替换所有剩余$的\)

但我不知道怎么说"两个中的一个".

Mil*_*ler 6

使用perl单线程和触发器操作符:

perl -pe 's/\$/\\(/ .. s/\$/\\)/' test.txt
Run Code Online (Sandbox Code Playgroud)