1

内容が次のようなファイルがあります:

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 {....} 

複数の行にまたがるデータがある場合にこのコマンドを機能させるにはどうすればよいですか?私はシェルスクリプトを初めて使用しますが、答えのある説明が役立つでしょう。

前もって感謝します。

4

3 に答える 3

3

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

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

ロジック:すべての新しい行を:に変換してから、sedコードを使用して、すべての:を改行に変換しています注:私の仮定は、ファイルのどこにも存在しないということです。

于 2012-05-18T09:09:47.203 に答える
2

私の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
于 2012-05-18T09:15:09.223 に答える
1

これはあなたのために働くかもしれません:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
  • 最初のコマンドはすべての単一行を削除します/^control_data {.*}$/d
  • 2番目のコマンドはすべてのブロックを削除します/^control_data {/,/^}$/d
于 2012-05-18T13:54:25.087 に答える