sedを使用してパターンを一致させ、diffファイルに出力する方法

sedを使用してパターンを一致させ、diffファイルに出力する方法

次のプレーンテキストファイルがあります。

*,cli-verify-aggregation-general,./link-aggr/aggregation.xls
-,stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls

「-」で始まる行だけを含む他のファイルが必要です。

結果ファイル:

stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls

「-」があってはなりません。

ベストアンサー1

欲しいものを達成する方法はいくつかあります。入力ファイルが呼び出され、出力が出力されると仮定input.txtすると、output.txt次のようになります。

1.awk使用方法及びcut

awk '/^-/' input.txt | cut -d "," -f 2-  > output.txt

これは、aで始まるすべての行をawk一致させ、一致する行を標準出力に印刷するように指示します(これはデフォルトのジョブであるため、明示的に指定する必要はありません)。input.txt-

これはへの入力としてパイプされ、cut各コンマ()で行を区切り、次-d ","を除いて識別されたすべてのフィールドを印刷します。第二()、削除したい先行を省略します-f 2--

その後、出力はファイルにリダイレクトされます。

詳細は以下で確認できます。GNU Awkユーザーガイド興味があれば。

2.grep使用方法及びcut

この「簡単な」設定では、代わりにawkを使用することもでき、grep同様の効果があります。

grep "^-" input.txt | cut -d "," -f 2- > output.txt

使用する正規表現は同じです。つまり、aと一致するが-その行の最初の文字として現れる場合にのみ当てはまります(これはまさに上記の意味です^)。

3. 使用方法sed

sed最後に、以下を使用してこれを達成することもできます。

sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt

これはsed、2つのルールを使用して処理することを示します。input.txt

  • まず、入力からすべてのファイルを削除します。いいえ-:firstで始まる^ということは、まだ次の行の最初の文字として現れるべきですが、表現では[ ... ]「」を意味します。とは別にa -". そのような行が見つかると削除されます(心配しないでください。sedオプションを指定しない限り、入力ファイルには触れません-i)。
  • 次に、すべての入力行で(s/.../.../)の先頭-,を...スペースに置き換えます(したがって削除します)。

出力はファイルにリダイレクトされます。

@Sundeepが指摘したように、これは次のことを宣言してより簡潔な単一の規則に置き換えることもできます。

sed -n 's/^-,//p' input.txt > output.txt

sedこれを開始するすべての行から先行を削除し、一致する行-,(末尾)のみを印刷し、p出力をファイルにリダイレクトするように指示します。ノート-nいわゆる出力を抑制するには、ここでオプションが重要です。パターン空間これは達成しようとする目標を妨げる。

おすすめ記事