Sedは特定の場所のセットで置き換えられます。

Sedは特定の場所のセットで置き換えられます。

次のサンプル入力ファイルがあります。

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 つの以前のジョブによって変更された、または変更されていない行を表示する現在の行の無条件印刷

おすすめ記事