我知道类似的问题在这个论坛上有人问过,但据我所知,他们都没有解决模式处于不同行的问题。即,给定一个文本文件
( one ) ( two ) (
three
)
four
即使该对的元素位于不同行,如何删除每个“(”和“)”对之间的所有内容?期望的结果是
() () ()
four
答案1
您可以使用 perl: slurp 将整个输入作为单个字符串,并使用命令s
上的标志s///
来指示换行符将被视为普通字符:
perl -0777 -pe 's/\(.*?\)/()/sg' <<END
( one ) ( two ) (
three
)
four
END
() () ()
four
答案2
Python
选择:
python -c 'import sys,re; print(re.sub(r"\([^()]+\)","()",sys.stdin.read().strip()))' <file
输出:
() () ()
four
答案3
这可以通过 Python 中的简单状态机来解决。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fileinput
import sys
active = True
for line in fileinput.input():
for ch in line:
if ch == '(':
sys.stdout.write(ch)
active = False
elif ch == ')':
sys.stdout.write(ch)
active = True
elif active:
sys.stdout.write(ch)
用法:
$ echo '( one ) ( two ) (
three
)
four' | python /tmp/statemachine.py
输出:
() () ()
four
答案4
sed
即使存在嵌套括号,使用and 也会处理。
sed -z 's/[^()]*)/)/g' infile
输入:
( (zero) one ) ( two ) (
three
)
((((nested))here)end) last
four
输出:
( ()) () ()
(((()))) last
four