2016-04-25 3 views
0

私は、次のsedコマンドがあります。2つのパターンマッチ

sed -n '/^out(/{n;p}' ${filename} | sed -n '/format/ s/.*format=//g; s/),$//gp; s/))$//gp' 

を私はのように1行としてそれを実行しようとしました:

sed -n '/^out(/{n;}; /format/ s/.*format=//g; s/),$//gp; s/))$//gp' ${filename} 

しかし、それはまた、私はドン行を表示欲しいもの(一致しないもの)。

entry(variable=value)), 
format(variable=value)), 
entry(variable=value))) 
out(variable=value)), 
format(variable=value)), 
... 

は、私はちょうど出て、エントリの後に来た形式の行をしたい:

は私が持っていることのようにいくつかの文字列を含むファイルです。 outが見つかったら、それは次の行(n)に進出し、pフラグを付けてsコマンドを使用しています

sed -nr '/^out[(]/ {n ; s/.*[(]([^)]+)[)].*/\1/p}' your_file 

:と、

+0

私はgrepでそれを行うことができると知っていますが、私は単一のコマンド(単一のgrep、単一のawkまたは単一のsed)を使用したいと思います。/cpuフットプリント – Lin

+0

あなたの質問の2番目のsedコマンドは、あなたが与えたサンプル入力に対して完璧に機能します。 –

+1

@Linもっと簡単ですあなたがサンプル入力と出力が必要な場合は、すべてのために。 –

答えて

1

をそれらの末尾))または)を削除しますが、このsedコマンドを使用することができますかっこ内のものだけを抽出する。

説明:

  • 私は[(]代わりの\(を使用。外側の括弧(は通常、グループ化を意味します。文字の場合は、(を入力する場合は、\(としてエスケープするか、角括弧内に入れる必要があります。ほとんどのREの特殊文字は、大括弧の中に入ればエスケープする必要はありません。
  • ([^)]+)は(^)(リテラル閉じ括弧)ではない1つまたは複数の(+)の文字で構成されるグループを(「(」ここでREメタ文字ではないリテラルの括弧ある)を意味し、^は、文字クラス[ ... ]を反転します
+0

私はいくつかの変数/値の中にアウトワードを見つけることができるので、ちょうど^ outのために変更することを約束しているようです。 – Lin

+0

あなたの回答は私が上記で提供したデータにぴったりです。 (私は今、それが正確にオリジナルのソースデータではないことに気づいた)。しかし、大丈夫です。私は実際のデータに合わせて必要な修正を加えました。 – Lin

+0

@Linは '/../'の間のパターンを変更しました –

関連する問題