下のファイルの数を#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
次のようにご利用ください。\n
optionsによって削除されるため、その行には表示されない二重引用符の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