如何用内部可能的换行符替换成对的令牌?
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
只有在没有换行的情况下才执行此操作。
另一种可能性是利用两次传递:
- 第一个用
\(
替换两个中的一个 $
- 第二个用
\)
替换所有剩余的$
但是我不知道怎么说“二选一”。
使用 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
假设我有一个文件,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
只有在没有换行的情况下才执行此操作。
另一种可能性是利用两次传递:
- 第一个用
\(
替换两个中的一个 - 第二个用
\)
替换所有剩余的
$
$
但是我不知道怎么说“二选一”。
使用 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