删除不同行中出现的模式之间的文本

删除不同行中出现的模式之间的文本

我知道类似的问题在这个论坛上有人问过,但据我所知,他们都没有解决模式处于不同行的问题。即,给定一个文本文件

( 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

相关内容