Альтернатива Bash для обрезки новой строки \n и дополнительный пробел

я пытаюсь разобрать многострочное предложение:

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 для синтаксического анализатора.

1
задан 14 March 2021 в 22:44

2 ответа

С 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
2
ответ дан 18 March 2021 в 23:26

-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.
4
ответ дан 18 March 2021 в 23:26

Другие вопросы по тегам:

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