Заменить один символ другим в файле, разделенном табуляцией - PullRequest
0 голосов
/ 08 мая 2018

Привет, я хочу заменить все. (точки) на -1 в файле с разделителями табуляции.

.   .   .   .   .   .
.   .   .   .   .   .
.   0.4012  0.359026    0.3616  0.246   0.4324
.   0.6795  0.60024 0.4713  0.6171  0.7386
.   0.6863  0.614018    0.5227  0.6131  0.7376
.   .   .   .   .   .
.   0.2044  0.210264    0.1936  0.2192  0.2376
.   0.2043  0.210064    0.1929  0.2183  0.2376
.   0.9852  0.984625    0.9425  1   1
.   .   0.10603 0.1127  0.127   0.0427
.   0.6934  0.709864    0.8222  0.6944  0.664
.   0.0219  0.0213658   0.0015  0.0397  0.0219
.   .   .   .   .   .

Как бы то ни было, я не хочу заменять присутствующие точки цифрами, т. Е. 0,4012 или 0,359.

Я попробовал этот код

perl -p -i.backup -e 's/". /-1/g' .\abc.txt

но это не сработало

Вывод, который я получил, был

.   .   .   .   .   .
.   .   .   .   .   .
.   0.4012  0.359026    0.3616  0.246   0.4324
.   0.6795  0.60024 0.4713  0.6171  0.7386
.   0.6863  0.614018    0.5227  0.6131  0.7376
.   .   .   .   .   .
.   0.2044  0.210264    0.1936  0.2192  0.2376
.   0.2043  0.210064    0.1929  0.2183  0.2376
.   0.9852  0.984625    0.9425  1   1
.   .   0.10603 0.1127  0.127   0.0427
.   0.6934  0.709864    0.8222  0.6944  0.664
.   0.0219  0.0213658   0.0015  0.0397  0.0219
.   .   .   .   .   .

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Ваш Perl не слишком далеко.

Помните, что команда замещающего формата - s/pattern/replacement/flags, как и в sed. Шаблон представляет собой регулярное выражение , где одна точка переводится как «любой отдельный символ». Чтобы сопоставить литерал точку, вам нужно экранировать ее с обратной косой чертой или заключить в квадратные скобки.

perl -p -i.backup -e 's/\.([^0-9])/-1\1/g' abc.txt

Это соответствует буквенным точкам, за которыми следует что-то отличное от цифры, и заменяет их заменяющей строкой вместе с любым нечисленным символом (\1). Похоже, что Perl считает ноль в конце строки нецифровым, что позволяет заменять точки в конце строки.

Обратите внимание, что в Perl вы также можете заменить [^0-9] на [^\d] или \D и \1 на $1. Но первый работает только в Perl и (некоторых) инструментах GNU, а последний - не самая распространенная нотация среди инструментов командной строки. Лично я предпочел бы сделать свои регулярные выражения и замены более переносимыми, чтобы, если бы я переключился с Perl на, скажем, awk, мне не пришлось бы переписывать столько кода.

Например:

gawk '{$0=gensub(/\.([^0-9])/,"-1\1","g")}1' abc.txt > ,$$ && mv ,$$ abc.txt

или

sed -i.backup -Ee 's/\.([^0-9])/-1\1/g' abc.txt

Переносимость, как правило, хорошая вещь, если вы можете управлять ею.

0 голосов
/ 08 мая 2018

После awk может помочь вам в том же.

awk '{for(i=1;i<=NF;i++){sub(/^\.$/,"-1",$i)}} 1' Input_file

Измените awk на awk -F"\t" И Input_file на OFS="\t" Input_file, если у вашего Input_file есть разделитель в качестве TAB, и вы хотите иметь вывод также в формате TAB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...