2

私はawkが初めてで、この問題に悩まされています。基本的に、私はパターンを検索しています。各一致を「--」で区切りたいので、ルビーでyamlライブラリを簡単に使用してファイルを解析できます

awk '/(start)/,/(end)/' #awk command I am doing

私が得るもの:

start
foo
bar
end
start
foo2
bar2
end
start
foo3
bar3
end

私が欲しいもの:

start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end

何か案は?

4

6 に答える 6

4

sed のコード

sed '/end/a --' file
始める
ふー
バー
終わり
--
始める
foo2
バー2
終わり
--
始める
foo3
bar3
終わり
--
于 2013-06-11T21:23:20.973 に答える
3

1 つのアイデアは、範囲がいつ終了するかを確認し、それらのダッシュを出力することです。だから私はその条件で明示的なもので暗黙的なデフォルトを変更しましたprint

awk '/start/,/end/ { print ( $0 ~ /end/ ) ? $0 "\n--" : $0 }' infile

次の結果が得られます。

start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
于 2013-06-11T20:48:44.073 に答える
2

アドレス範囲を使用しない場合:

awk 'NR>1 && $1=="start" {print "--"} 1'
于 2013-06-11T21:23:32.757 に答える
2

awk (アドレス範囲なし、条件は 1 つだけ):

awk '1;$0=="end" {print "--"}' file
于 2013-06-11T22:11:21.683 に答える
1

awk '1;/^end$/{print "--"}' file

1無条件に各行を印刷します。("If expression 1is true, do the default action, which is print".)
次に、2 番目のパターンが出力されます--が、行が一致する場合のみです。^end$

于 2013-06-12T00:49:15.043 に答える