Unixで2つの括弧の間の文字列を削除する方法

Unixで2つの括弧の間の文字列を削除する方法

ファイル内の2つの括弧の間にある文字列または数字を削除する必要があるなどの要件があります。sedコマンドを使用しましたが、1行で実行されます。開くかっこは1行にあり、閉じ括弧は別の行にあります。どうすればいいですか?

次のコマンドを試してみましたsed

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

ただし、これは開かっこと閉じ括弧が同じ行にある場合にのみ機能します。

たとえば:-

入力ファイル:

select a
,b
,c
FROM ABCD
(select e
,f
,g
,h FROM XYZ)

出力は次のようになります。

select a
,b
,c
FROM ABCD

答え1

次の単純なPerlスクリプトを使用して、複数行にまたがるすべての角かっこペアとその内容を削除します。

#!/usr/bin/perl
undef $/;
$text = <>;
#Flags: g=match repeatedly; s=dot matches newline
$text =~ s/\(.*?\)//gs;
print $text;

これをコマンドラインに入れるには、次の1行バージョンを使用してください。

perl -p0777e 's/\(.*?\)//gs' [filename]

Perlソリューションよりも短くて簡単であることに注意してください。-0777行区切り記号(-0以下のフラグを参照man perlrun)を無効にして、ファイル全体が1つの手順で処理されるようにします。良い古いPerl...また(通常Perlの場合:-))sedのパターンスペースを操作するよりも読みやすくなります。

答え2

ew行を保持します\n(次の2行に括弧がある場合)。

sed -e 's/\(^[^)]*) *\)\|([^)]*\() *\|$\)//g' filename

スクリプトには3つのモードが含まれています。

  • ^[^)]*) *それ以降)を除いて、任意の記号で始まる行。)space(s)
  • ([^)]*(以下を除くすべての記号で)
    • )またはその後space(s)
    • $(行末)まで

複数行の場合:

sed ':1;s/([^)]*)//g;/(/{N;b1};' filename

答え3

Gnu Sedを使用してください。

-zオプション(ヌルで区切られたレコード)、sedはすべての入力を単一のレコードとして扱います。試してみてください:

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

答え4

sedを使用した複数行の一致の場合、通常はファイル全体を読み取り、内容全体の検索/置換を実行するのが最も簡単です。

sed -n '            # disable auto-printing
  1h                # first line, move to hold space
  1!H               # not the first line, append to hold space
  ${                # at the end of file
    x               # move hold space to pattern space
    s/([^)]*)//gp   # perform search/replace and print
  }
' file

より単純な(*)オプションもあります:

awk -v RS="" '{gsub(/\([^)]+\)/,"")} 1' file
perl -0777 -pe 's/\(.*?\)//sg' file

(*)「もっと簡単」可能美しさは見る人の目にかかっています…

関連情報