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

How to replace paired tokens with possible newlines inside?

假设我有一个文件,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/$\([^]]*\)$/\(\)/g' test.txt

只有在没有换行的情况下才执行此操作。

另一种可能性是利用两次传递:

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

但是我不知道怎么说“二选一”。

使用 perl 单行代码和 flip-flop operator:

perl -pe 's/$/\(/ .. s/$/\)/' test.txt

使用 gnu-awk:

awk -v RS='\$[^$]*\$' 'RT{sub(/$/, "\(", RT); sub(/$/, "\)\n", RT); print RT}' file
\(foobar\)

\(
foobar
\)

\(
foobar\)

\(foobar
\)

\(
foo
bar
\)

\(
foo
bar\)

\(foo
bar
\)
 awk '{ while(/$/) sub("\$", ++c%2 ? "\(" : "\)" ) }1'  file