SED Заменить проблему

Версия awk (GNU)

awk '{printf ("%s ||| ", $0); getline < "fileB"; print $0 }' fileA

С помощью команды getline в awk можно установить $0 (все переменные для столбцов) из следующей записи ввода, если getline , то устанавливается следующий $0 из указанного файла.

getline


Почему ваша попытка не сработала так, как вы ожидали? Из man paste мы можем прочитать

-d, --delimiters=LIST
     reuse characters from LIST instead of TABs

но он использует разделители по одному для каждого столбца.

Поэтому команда
paste -d '|*|*' fileA fileB fileA fileB дает мне строки

Hi 1,3 I am hungry.|Hi 1,3 Ich habe Durst.*Hi 1,3 I am hungry.|Hi 1,3 Ich...
Hi 1,4 I am foolish.|Hi 1,4 Ich bin neu.*Hi 1,4 I am foolish.|Hi 1,4 Ich...


Решение sed, которого я советую избегать, даже если оно близко к вашей первоначальной попытке, потому что оно подменяет полученное поведение вашей первоначальной целью:

 paste -d '|' fileA fileB | sed 's/|/|||/g'

избегать, потому что вы заменяете каждый шаблон | на новый ||||, но вы должны предположить, что символ трубы (|) не присутствует в ваших данных, иначе вам придется иметь дело с особыми случаями и усложнять код, чтобы избежать побочных эффектов.


Вариант с конструкцией Here String [1]

 paste -d ' ||| ' fileA - - - - fileB  <<< ''

Вы устанавливаете 5 разделителей с помощью -d ' ||| ' (пробел, |,|,|,|,пробел) и 4 фиктивных файла (- - - - -), которые будут брать данные из пустой строки '''.


Проверено на GNU Awk 4.0.1, paste (GNU coreutils) 8.21 и sed (GNU sed) 4.2.2

0
28.06.2018, 16:16
1 ответ

С помощью sed способ реализации не--жадного сопоставления состоит в том, чтобы указать набор символов, которого вы не хотите сопоставлять:

sed -i 's/=ABC[^_]*_/=XYZ12_/g' INCR.parm

То есть :соответствует «ABC», за которым следует ноль или более не -символов подчеркивания, за которыми следует подчеркивание.

И заметьте, вы не избегаете точки. «Голая» точка означает «соответствует любому символу»; экранированная точка означает «соответствовать буквальной точке». Вы не делали никаких замен, потому что ни одно из данных не соответствует буквальной строке "ABC".

1
28.01.2020, 02:42

Теги

Похожие вопросы