grep
явно определено для игнорирования новых строк, поэтому вы не можете использовать это. sed
внутренне знает, заканчивается ли текущая строка (фрагмент )новой строкой или нет, но я не понимаю, как его можно заставить раскрыть эту информацию. awk
разделяет записи символом новой строки (RS
), но на самом деле не имеет значения, был ли он вообще, действие print
по умолчанию — в любом случае печатать новую строку(ORS
)в конце.
Таким образом, обычные инструменты здесь не кажутся слишком полезными.
Тем не менее, sed
знает, когда он работает с последней строкой, поэтому, если вы не возражаете против потери последней неповрежденной строки в случаях, когда частичная строка не видна, вы можете просто sed
удалить то, что он думает, что это последний. Например.
sed -n -e '$d' -e '/pattern/p' < somefile # or
< somefile sed '$d' | grep...
Если это не вариант, всегда есть Perl. Это должно печатать только те строки, которые соответствуют /pattern/
, и иметь новую строку в конце:
perl -ne 'print if /pattern/ && /\n$/'
Это должно работать:
VAR2="$(curl<..> | sed -E -n 's/.*fileId":"([^"]+).+/\1/p')"
Проблема с вашей попыткой заключается в том, что вы использовали \2
в команде sed
, но у вас есть только одна группа регулярных выражений. Я думаю, вам следует взглянуть на информационную страницуsed
, чтобы понять, как работает sed
.