N番目の文字の後に特定のテキストを置き換える

N番目の文字の後に特定のテキストを置き換える

下のファイルの数を#Mi

10番目"以降の数字にのみ適用されます(二重引用符)。

入力ファイル

"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi 1002.47 1018.81 1016.68 
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi 501.24 509.41 508.34 
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi 55.69 56.6 56.48 

結果ファイル

"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi 
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi 
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi

答え1

そしてsed

<your-file sed '
  s/"/"\
/10;                          # add a newline after the 10th "
  h;                          # save a copy
  s/.*\n//;                   # remove everything before the newline
  s/[0-9.]\{1,\}/#Mi/g;       # replace numbers with #Mi
  G;                          # append saved copy
  s/\(.*\)\n\(.*\)\n.*/\2\1/; # put it back together'

使用perl(5.14.0以降のr代替フラグ):

perl -pe 's{(.*?"){10}\K.*}{$& =~ s/[\d.]+/#Mi/gr}e' < your-file

以前のバージョンの場合(まだ5.10.0以降\K):

perl -pe 's{(.*?"){10}\K.*}{($r = $&) =~ s/[\d.]+/#Mi/g; $r}e' < your-file

以前のバージョンの場合:

perl -pe 's{((?:.*?"){10})(.*)}{
  $l = $1; ($r = $2) =~ s/[\d.]+/#Mi/g; $l.$r}e' < your-file

同時に数字1つ以上の数字で構成されるシーケンスまたは.。 10日以降の入力127.0.0.1これが発生する可能性がある場合に備えて、パターンが他の場所と一致しないようにパターンをトリミングしたい場合が...あります。たとえば、では、前後にスペースがない数値 - ドット - 数字です。. "perl(?<!\S)\d+\.\d+(?!\S)

あなたのサンプルでも

perl -pe 's/(?<!\S)\d+\.\d+(?!\S)/#Mi/g' < you-file

10番前の部分には"こんなことがないので十分です数値 - ドット - 数値空白以外の文字で囲まれていません。それはすべてあなたが取り替えたいものとあなたが入れたもので何が起こることができるかに依存します。いいえ交換したい。

答え2

perl次のようにご利用ください。\noptionsによって削除されるため、その行には表示されない二重引用符の10番目の出現を示します-l


$ perl -lpe '
    s/((?:.*?"){10})/$1\n/;
    s/(?<!\S)\d+\.\d+(?!\S)(?!.*\n)/#Mi/g;
    tr/\n//d;
' file

$ d='[[:digit:]]' f="$d$d*[.]$d$d*" r='#Mi' 
$ sed -Ee "
    s/\"/&\n/10
    :loop
       s/(\n.*\s)$f(\s|\$)/\1$r\2/
    t loop
    s/\n//
" file

関連情報