次のサンプル入力ファイルがあります。
Apple Orange Gold Silver Spoon Apple Orange Gold
Apple
Apple Orange
Apple Orange
Mango Gold Silver Spoon Apple Orange
15〜20番目の位置が空白であることを確認し、それを文字列に置き換える必要がありますSilver
。また、50〜70位のコンテンツを完全に置き換える必要があります。xxxxxxxxxxxxxxxxxxxxx
ベストアンサー1
より小さい行を処理する方法に応じて(上記の説明を参照)、sed
解決策は次のとおりです。
sed -e '/^.\{14\} \{6\}/s/^\(.\{14\}\) \{6\}/\1Silver/' \
-e '/^.\{49\}./s/^\(.\{49\}\)\(.\{1,21\}\)\?\(.*\)\?/\1xxxxxxxxxxxxxxxxxxxxx\3/'
そして、よりクリーンでエラーの少ないGNUawk
バージョンは次のとおりです。
awk '
BEGIN { FIELDWIDTHS = "14 6 29 21 999" ; OFS = "" }
$2 == " " { $2 = "Silver" }
$4 != "" { $4 = "xxxxxxxxxxxxxxxxxxxxx" }
{ print }
'
説明する:
1.) sed:このsed
コマンドは、2つの独立した置換で構成されています。最初は「シルバー」ケースを処理し、2番目は「xxx ...」ケースを処理します。交換形態sed
は次のとおりです。
/pattern/s/pattern2/replacement/
最初のパターンが一致した場合、対応する置換が実行され、その行の場合、2 番目のパターンが置換式で置き換えられます。詳細はsed
一般的に秘密です。
.
-どんなキャラクターでも
\{14\}
- 前のサブ式を繰り返します(ここでは14回)。
\(expr\)
- 代替文字列で等として参照できるサブ式\1
。\2
ここで、実際の数字はn番目の角括弧式として定義されます。
\?
– 前のサブ式がオプション部分であることを指定します。
2.) アーク:プログラムはこのセクションを一度実行し、左側のawk
条件が真の場合にのみBEGIN
データファイルの各行の後続のセクションとその右側のタスクを実行します。{...}
FIELDWIDTHS
$i
- 各フィールドが(一部のフィールド番号iの場合)として処理できるように、入力行のデータフィールドの幅を指定します。
OFS=""
- 空の文字列、出力フィールドに追加の区切り文字を含めないでください。
$2 == " "
- 2番目のフィールド(仕様に従ってFIELDWIDTHS
)に6つのスペースが含まれている場合は、対応する文字列に置き換えます。
$4 != ""
- 4番目のフィールドにデータが含まれている場合は、「xxx ...」文字列に置き換えます。
{ print }
- 1 つまたは 2 つの以前のジョブによって変更された、または変更されていない行を表示する現在の行の無条件印刷