я пытаюсь разобрать многострочное предложение:
You have to go tomorrow by
car.
, Как вы видите, существует новая строка + пространство затем "автомобиль".
я использовал этот regex:
You.have.to.go.tomorrow.by.\n.+
Это работало отлично, когда я использовал его с regex101, но когда я использовал его в ударе, это работало только на первое предложение:
Parser='You.have.to.go.tomorrow.by.\n.+'
Результат:
You have to go tomorrow by
я использую удар, я хочу полное предложение:
"You have to go tomorrow by car."
я использую:
sed -e 's/<[^>]\+>/ /g' | grep -oP $parser
для удаления всех HTML-тэгов затем grep для синтаксического анализатора.
TR
<FileName tr '\n' ' ' | tr -s ' '
XARGS
<FileName xargs
Изменение Имя файла
с именем файла, содержащего два строки.
<Имя файла
будет прочитать файл и выводить на stdin ... i.e что-то вроде имя файла Cat |
.
TR '\ N' ''
приносит две линии в одну строку.
TR-S ''
удаляет несколько мест, оставляющих только отдельные пробелы.
XARGS
по умолчанию Trims Newlines и дополнительным белым пространством в рамках его работы, чтобы преобразовать вход от stdin в аргументы в команду ... I.e. Вот как это работает, чтобы сделать свою работу.
Вы также можете проводить вывод из SED
на TR
, как:
<FileName sed -e 's/<[^>]\+>//g' | tr '\n' ' ' | tr -s ' '
или из SED
- xargs
:
<FileName sed -e 's/<[^>]\+>//g' | xargs
-z, --null-data
разделяет строки с символом NUL вместо newline, что позволяет сопоставлять их с новыми строками.
grep -Pzo \
'You have to go tomorrow by\n\s+car.' text | tr -s '\n ' ' '
Если бы вы делали это на чистом баше, вам, вероятно, понадобилось бы ANSI-цитировать ваш шаблон, чтобы представить newline.
#!/bin/bash
pattern=$'You have to go tomorrow by\n\s+car.'
[[ $(<text) \
=~ ($pattern) ]] && echo ${BASH_REMATCH}
Предположим, что вы собираетесь очистить только ту линию, на которую ссылаетесь, тогда можно комбинировать замены. При совпадении со строкой, содержащей 'Вы должны перейти завтра на ', мы можем сгруппировать и выполнить несколько команд со скобками {...}
, разделенными точкой с запятой, на этом совпадении.
sed -rn '/You have to go tomorrow by/{N; s/\n//; s/ {2,}/ /; s/<[^>]+>//g;p}' text
N
Читайте следующую строку и добавьте ее в пространство шаблона. s
подстановочный текст. g
глобальный, подставить все вхождения в строку. Печать p
.