別の行に表示されるパターン間のテキストの削除[重複]

別の行に表示されるパターン間のテキストの削除[重複]

わかりましたエマルジョン誰かがこのフォーラムに質問しましたが、私が知っている限り、それらのどれも他の行のモードの問題に対処していませんでした。つまり、テキストファイルが与えられると

( 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入れ子のかっこがあっても、 と を使って処理します。

sed -z 's/[^()]*)/)/g' infile

入力する:

( (zero) one ) ( two ) (

three

)

((((nested))here)end) last
four

出力:

( ()) () ()

(((()))) last
four

関連情報