OK、質問の下のコメントで明確にした要件を満たすために、私は物事を2つの部分に分けます:
at_
最終番号の直前に読み取るすべての行を除外する
- 残りの行から、最後にあるアンダースコアを削除し、バックスラッシュが前に付いた山括弧で数値を囲みます。
パート1の解決策:
これは、望んでいないものと正確に一致する正規表現を記述し、一致しない行のみを出力するように呼び出しコマンドに伝えることにより、最も簡単に実行できます。これはで最も簡単に実行できるgrep
ため、使用してみましょう。
egrep -v "at_[0-9]+" sst_piso_top_c0.spf_typ_C
-v
または--invert-match
オプション伝えるgrep
唯一の非マッチングラインを印刷します。
パート2の解決策:
これはsed
s(ubstitute)-command で最も簡単に行えます:
sed -r 's/_([0-9]+)$/\\<\1\\>/g'
正規表現は、アンダースコアと行末の数字に一致します。番号部分を角かっこ(...)
で囲むことにより\1
、置換セクションに貼り付けることができます。完全な置換セクションは、数値の後方参照を囲むバックスラッシュ付きの山括弧で構成されています\\<\1\\>
。バックスラッシュは\\
特別なエスケープ文字として扱われるため、別のバックスラッシュでエスケープする必要があります。
すべてを一緒に入れて:
egrep
1. のコマンドからの出力をsed
2. のコマンドにパイプすると、sed
コマンドはそれを入力ストリームとして使用します。
egrep -v "at_[0-9]+" sst_piso_top_c0.spf_typ_C | sed -r 's/_([0-9]+)$/\\<\1\\>/g' > sst_piso_top_c0.spf_typ_C.new
通常、sed
結果は標準出力に送信されるため、上記の行はそれらをファイルにリダイレクトします(> newfile
)。このファイル名は、egrep
読み取り元のファイル名と異なる必要があることに注意してください。そうしないと、読み取り元と同じファイルが上書きされ、空のファイルになってしまいます。