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