Я полагаю, уловка состоит в том, чтобы использовать -3t
для первого pr
, а затем также добавить ] -w200
(или около того), чтобы избежать обрезки последнего столбца.
В более общем случае, если у вас есть N матриц, вы должны использовать pr - $ {N} t -w $ ((N * W))
в качестве первой команды pr
, где W
- ширина символа одной матрицы (скажем, примерно 10 для каждого столбца плюс бит).
Все остальное должно быть в порядке.
Просто используйте другой разделитель, который не является частью вашей строки.
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)
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'