Ваша команда sed
отправляет результат только на стандартный вывод.
Вам придется перенаправить его в последующей команде (НЕ в той же самой команде, например sed 'sedcommand' file > file
, так как это приведет к стиранию файла до его обработки).
Вы также можете передать команды в ed
вместо использования sed
:
for file in $filelist ; do
echo -e '%s/yyyymmdd/YYYYMMDDHH24MISS/g\nw' | ed $file
done
который заменяет в каждой строке (%
), а затем, после разделительной новой строки (\n
), записывает измененный файл на место (w
).
Кажется, вы определили правильное регулярное выражение, но не установили достаточные флаги в строке команды -, чтобы grep
его понял. Потому что по умолчанию grep
поддерживает BRE, а с флагом -E
— ERE. То, что у вас есть (смотреть -вперед )доступно только в варианте регулярного выражения PCRE, который поддерживается только в GNU grep
с его флагом -P
.
Предполагая, что вам нужно извлечь только совпадающую строку после prefix
, вам нужно добавить дополнительный флаг -o
, чтобы сообщить grep
, что печатается только совпадающая часть как
grep -oP '(?<=prefix).*$' <<< prefixSTRING
Существует также версия grep
, которая по умолчанию поддерживает библиотеки PCRE -pcregrep
, в которой вы можете просто выполнить
pcregrep -o '(?<=prefix).*$' <<< prefixSTRING
Подробное объяснение различных разновидностей регулярных выражений дано в этом замечательном ответе Джайлса и инструментах, реализующих каждый из них
Регулярные выражения бывают разных видов. Вы показываете Perl -как регулярное выражение (PCRE, "Perl Compatible Regular Expression" ).
grep
использует регулярные выражения POSIX. Это базовые регулярные выражения(BRE )и расширенные регулярные выражения(ERE, если grep
используется с опцией -E
). См. руководство для re_format
или regex
или любое другое подобное руководство, на которое ссылается ваше руководство grep
в вашей системе, или стандартные тексты POSIX, на которые я только что ссылался.
Если вы используете GNU grep
, вы сможете использовать Perl -как регулярные выражения, если вы использовали grep
с опцией -P
, специфичной для GNU grep
-.
Также обратите внимание, что grep
по умолчанию возвращает строк , а не подстроки из строк. Опять же, с GNUgrep
(и некоторыми другими реализациями grep
)вы можете использовать опцию -o
, чтобы получить только бит (s ), который соответствует заданному выражению из каждой строки.
Обратите внимание, что -P
и -o
не являются -стандартными расширениями спецификации POSIXgrep
.
Если вы не используете GNU grep
, вы можете вместо этого использовать sed
, чтобы получить бит между строкой prefix
и концом строки:
sed -n 's/.*prefix\(.*\)/\1/p' file
При этом печатаются только те строки, к которым sed
удается применить данную замену. Подстановка заменит всю строку, соответствующую выражению (, являющемуся BRE ), на ее часть, расположенную после строки prefix
.
Обратите внимание, что если в строке есть несколько экземпляров prefix
, вариант sed
вернет строку после последнего , а вариант GNU grep
вернет строку после первый один (, который будет включать другие экземплярыprefix
).
Решение sed
будет переносимым на все Unix -подобные системы.
Как указывалось в других ответах, grep
не использует вариант регулярного выражения с просмотром назад (по умолчанию в GNU grep
или вообще не использует его в других версиях ).
Если вы не можете использовать GNU grep
или pcregrep
, вы можете использовать perl
, если он у вас есть.
Командная строка эквивалентна perl
::
perl -ne 'print if /(?<=prefix).*$/' <<< prefixSTRING
Вы помещаете нужное регулярное выражение между косой чертой. Поскольку вы используете Perl, здесь используется разновидность регулярных выражений Perl .