Как заменить / на . в файле с помощью sed

Я полагаю, уловка состоит в том, чтобы использовать -3t для первого pr , а затем также добавить ] -w200 (или около того), чтобы избежать обрезки последнего столбца.

В более общем случае, если у вас есть N матриц, вы должны использовать pr - $ {N} t -w $ ((N * W)) в качестве первой команды pr , где W - ширина символа одной матрицы (скажем, примерно 10 для каждого столбца плюс бит).

Все остальное должно быть в порядке.

1
07.02.2019, 12:52
2 ответа

Просто используйте другой разделитель, который не является частью вашей строки.

echo 'http://www.google.com  (20/01/1990)' | sed -r 's@([0-9]+)/([0-9]+)/([0-9]+)@\1.\2.\3@g'
http://www.google.com  (20.01.1990)
3
27.01.2020, 23:18

bash — оболочка, интерпретатор командной строки. Его роль - запускать команды. sedи perl— это две команды, которые может выполнять bashили любая другая оболочка.

Оба являются интерпретаторами какого-то языка программирования, но здесь это не имеет значения. Оба отлично справляются с обработкой текста, поскольку они были разработаны для этого. sed— стандартная команда, но существует множество различных реализаций, которые будут несовместимы, если вы отклонитесь от того, что указано в POSIX, perl— нет, но существует только одна реализация (, хотя и много разных версий с разным уровнем функций ).

Здесь, используя стандартный синтаксис sed, вы можете сделать:

sed 's|\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)|\1.\2.\3|g'

Это должно работать независимо от реализации sedпри условии, что она совместима с POSIX в пределах, указанных POSIX (в этом случае, если ввод является допустимым текстом, который на практике исключает очень длинные строки, последовательности байтов не образующие допустимые символы или строки без разделителей -, хотя некоторые реализации, такие как GNU sed, могут принимать их как расширение ).

С любой версией perlи любым вводом вы также можете записать его:

perl -pe 's|(\d\d)/(\d\d)/(\d{4})|$1.$2.$3|g'

Или с последними версиями илиperl:

perl -pe 's{\d\d/\d\d/\d{4}}{$&=~y|/|.|r}ge'

Если вы хотите избежать замены 1000/10/99999на 1000.10.99999, вы можете использовать операторы границы слов, которые доступны в perl, но не в стандарте sed(, хотя некоторые реализации поддерживают \</ \>или [[:<:]]/ [[:>:]]для этого в качестве расширения):

perl -pe 's|\b(\d\d)/(\d\d)/(\d{4})\b|$1.$2.$3|g'

Или посмотрите -вокруг операторов (снова, особенность perlрегулярных выражений, но не стандартных регулярных выражений sed ).

perl -pe 's|(?<!\d)(\d\d)/(\d\d)/(\d{4})(?!\d)|$1.$2.$3|g'

Вы можете сделать что-то эквивалентное стандартному sedс небольшим программированием(sedконструкции условного цикла):

sed -e :1 -e 's|^\(.*[^[:digit:]]\)\{0,1\}\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)\([^[:digit:]].*\)\{0,1\}$|\1\2.\3.\4\5|g; t1'
1
27.01.2020, 23:18

Теги

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