sedの使い方を理解しようとしています(他のツールが利用可能であることを知っていますが、sedでこれを行う方法を知りたいのですが、他のツールでより意味がある場合は教えてください)。次の内容を含むファイル
1234561234567809912345612345678 00000999988STRING ONE EX30 0600000001 K XXYY
1122331122334409922334466554433 00000123499STRING TWO EX99 0600000002 K XXYY
そして他のフォーマットの他の多くの行。
文字列の合計は、位置47〜64(後続のスペースを含む)にありますSTRING ONE
。STRING TWO
位置65-80のテキストを位置47-64の内容に基づいて別の値に変更したいと思います。
したがって、STRING ONE行の場合、文字65-80は「AAAABBBBCCCC」(末尾のスペース4つ)で修正されます。
STRING 2行目では、文字65-80は「XXXYYYZZZ」(末尾のスペース4つ)に変更されます。
これまで私がしたこと:
sed 's/^\(.\{64\}\)EX/\1234567890 /'
文字65の「EX」は「234567890」に置き換えられますが、
- 正しい行の選択に関係なく(「文字列1」または「文字列2」を使用)
- 「EX」のみ交換
ここでは重点を置いていない他のこともあります。
- 開くかっことバックスラッシュ中かっこの間に点があるのはなぜですか?
- 1の前にバックスラッシュを追加するのはなぜですか(必須ですが、代替文字列に1が含まれていません)。
grepを使用してこれを実行し、一時ファイルまたは環境変数の出力を操作できるようにしたいのですが、これをよりエレガントに実行できるかどうかを知っておくとよいでしょう。
ベストアンサー1
.
パターンの「すべての文字」を意味します。.\{64\}
「64文字」の1つを意味します。
\1
最初の一致グループ、つまり\(...\)
最初の括弧のペアに一致するグループの逆参照。テキストを挿入するには、1
前にバックスラッシュを付けないでください。
sedの「address」を使用して、次の特定の行にのみコマンドを制限できます。
sed '/^.\{46\}STRING ONE \{8\}/s/^\(.\{64\}\).\{16\}/\1AAAABBBBCCCC /'
それは言う行が46文字で始まり、後ろにSTRING ONE
8つのスペースがある場合は、最初の64文字を覚えてから、\1
16文字を記憶された文字に置き換え、その後にAAAABBBBCCCC
スペースが4つ続きます。
アドレスを含むコマンドを追加するには、セミコロンで区切るか、複数の-e
スイッチを使用します。
sed -e '/address1/s/pattern1/replacement1/;/address2/s/pattern2/replacement2/'
sed -e '/address1/s/pattern1/replacement1/' -e '/address2/s/pattern2/replacement2/'