альтернатива perl для sed, чтобы разделить несколько | - PullRequest
1 голос
/ 07 марта 2019

Я смог выполнить это с помощью команды sed, но не смог заставить его работать в perl.Хотелось бы добавить пробелы между символами канала, которые расположены близко друг к другу, без пробелов и буквенно-цифровых символов.

input           ==>  a|123|##||||
expected output ==>  a|123|##| | | |

Эта команда sed отлично работает:

echo "a|123|##||||" | sed 's/\([^[:blank:][:alnum:]]\)|/\1 | /g'

вывод для указанной выше команды ==> a|123|## | | | |

В Perl я не смог заставить его работать

echo "a|123|##||||" | perl -pe 's/\([^[:blank:][:alnum:]]\)|/\1 | /g'

с выводом для вышеуказанной команды

| a | | | 1 | 2 | 3 | | | # | # | | | | | | | | | 

Ответы [ 3 ]

6 голосов
/ 07 марта 2019

Чтобы добавить пробел только между теми |, которые идут рядом друг с другом

echo "a|123|##||||" | perl -pe's/\|(?=\|)/\| /g'

Я использую прогнозирование, чтобы иметь возможность обнаруживать последовательные (и перекрывающиеся!) Пары с более чем двумя| связаны друг с другом: потребляется только первый в матче, так что второй остается там для следующего матча, если есть еще один после него (снова утвержденный с предвкушением).

2 голосов
/ 08 марта 2019

Еще один способ - использовать lookahead и lookbehind.

$ echo "a|123|##||||" | perl -pe's/(?<=\|)(?=\|)/ /g '
a|123|##| | | |

$
0 голосов
/ 07 марта 2019

Правильный синтаксис Perl:

echo "a|123|##||||" | perl -pe 's/([^\s\w])\|/$1 | /g'
  • Символ пробела должен быть экранирован
  • $ 1 используется для первого совпадения группы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...