sedを使用して "{"から "}"から始めてファイルからすべての行を削除します

StackOverflow https://stackoverflow.com//questions/10649516

  •  11-12-2019
  •  | 
  •  

質問

コンテンツがこのようなファイルを持っています:

control_data {
some data dadadadf 
some data fsfsfs
some more data
.
.
.
}
more data below 
{
.
.
}
.

「control_data」から最初の "}" へのデータを削除したい

コマンドを試してみました

sed "s/control_data\([^}]*\)}//g"
.

しかし、これは複数の行などの行がない場合にのみ機能します。このコマンドは、次のようなデータがある場合に機能します。

control_data {some data dadadadf some data fsfsfs some more data...}more data
.

それは与える:

more data {....} 
.

複数行にデータがあるときにこのコマンドを機能させる方法 私はShell Scriptingに新しい答えでいくつかの説明が手助けをするのに長い道のりを上げることができました。

事前にありがとうございました。

役に立ちましたか?

解決

これは理想的なものではないかもしれませんが、このSED(あなたのSEDコード)

cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'
.

ロジック:すべての新しい行を次のものに変換してからSEDコードを使用してから、すべての変換:Newlines 注:私の仮定は次のとおりです。任意の場所でファイルに存在しない。

他のヒント

私のSED-FUは弱いですが、ここに働いたものです(この回答ガイドとして):

[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below 
{
.
.
}
.

コマンドの内訳があります

sed -n "             # "-n" = suppress automatic printing of pattern space
/^control_data {/ {  # if (line matches control data)
   :a;                 #   mark this spot with label a
   n;                  #   get next line
   /^}/!ba             #   if (doesn't start with "}") go back to label a
   n;                  #   get next line before leaving this control block
};                   # end if
p;                   # print everything else not affected by previous block
" input_file.txt
.

これはあなたのために機能するかもしれません:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
.

  • 最初のコマンドはすべての単一の線/^control_data {.*}$/d を削除します
  • 2番目のコマンドはすべてのブロックを削除する/^control_data {/,/^}$/d
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top