Нельзя так просто сравнивать машины. Вам нужно решить несколько вопросов:
С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
В обоих числах — любая последовательность из одной или нескольких цифр или .
. Возможно, вы захотите уточнить шаблон, чтобы он не совпадал с такими вещами, как 127.0.0.1
, ...
или .
в любом месте на случай, если такие вещи могут произойти во входных данных после 10 th"
. Например, в perl
это могут быть(?<!\S)\d+\.\d+(?!\S)
:цифры -точка -цифры, которым не предшествует и не следует не -пробел.
На вашем образце даже
perl -pe 's/(?<!\S)\d+\.\d+(?!\S)/#Mi/g' < you-file
было бы достаточно, так как часть перед 10 й"
не имеет ни одной из этих цифр -точка -цифры не -окружены не -пробел.Все сводится к тому, что вы хотите заменить, и что может произойти во входных данных, что вы не хотите подставлять.
С помощью perl
делаем это следующим образом. Отметьте 10-е вхождение двойной кавычки с помощью \n
, так как она никогда не может присутствовать в строке, поскольку она удаляется опцией -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