Команда Sed Regexp не работает

Почти 2 года спустя, но... кажется, что uuencode или почта не работают в Linux. Или, может быть, он работает правильно, но Outlook не работает. Кто знает?

uuencode a.gz a.gz | mail -s "тестирование uuencode из linux" me@domain.com

uuencode a.gz a.gz | mail -s "тестирование uuencode from aix" me@domain.com

При отправке из Linux Outlook показывает встроенный код uuencode. Отправка из AIX отображается в Outlook как вложение. Та же команда, тот же почтовый ретранслятор, другая ОС, разные результаты. О, может быть, это sendmail (aix )vs postfix (linux )? В любом случае, делайте выводы о месте поломки сами.

О, чтобы дать реальный ответ... mailx -a.gz -s "subject" me@domain.com

1
04.02.2020, 19:13
3 ответа

вы можете обойти это:sed "s@\^@\'\^@;s/$/\'/"

$ cat > toto
#multiline.pattern: ^\[
$ sed "s@\^@\'\^@;s/$/\'/" toto
#multiline.pattern: '^\['

Идея состоит в том, чтобы заменить ^на '^, а затем конец строки на 'с концом строки в двух последовательных действиях, чтобы упростить регулярное выражение.

конечно с sed -i...он изменяет файл

0
28.04.2021, 23:24

Учитывая ваш пример, что-то вроде этого должно работать:

$ cat ex
#multiline.pattern: ^\[

$ sed -e "s/^#multiline\.pattern:.*/multiline.pattern: '^\\\['/" ex
multiline.pattern: '^\['

Это заменяет строку, начинающуюся с #multiline.pattern:, за которой следует любое количество символов до конца строки, на шаблон, который вам нужен.

Шаблон, который вы ищете, включает в себя некоторые специальные символы (\, [), которые я экранировал дополнительным \(, например, \\дает вам литерал \, \[дает вам буквальный[).

1
28.04.2021, 23:24

Что-то не так, так это то, как цитируется последняя часть :

sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g'
  # ^                                               ^             ^ ?

Эта последняя часть backslashэкранирована до конца, где открывается еще одна одинарная кавычка . Вот почему bashдал подсказку $PS2>, позволяя вам вводить больше информации, пока цитата не будет закрыта другой'

Удалите последний 'и все заработает:

sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g
# or:
sed 's/multiline.pattern: ^\\\[/multiline.pattern: '"'^\\\['/g"
sed "s/multiline.pattern: ^\\\\\[/multiline.pattern: '^\\\['/g"
sed 's/multiline.pattern: ^\\\[/multiline.pattern: \x27^\\[\x27/g'

Также:

  • Судя по выходным данным вашего примера, вы также хотите удалить #. Для этого включите его в шаблон соответствия для sed(, используя любой стиль цитирования, который вы предпочитаете ):
  • .
sed 's/#multiline...'
  • Скобки можно использовать для «улавливания» частей вашего шаблона соответствия, чтобы вы могли повторно использовать эти части в подстановке (, называемой подвыражениями и обратными -ссылками):
sed -r 's/#(multiline\.pattern: )(\^\\\[)/\1'\'\\2\'/g

(использование -r/ --regexp-extendedдля этого не обязательно, но это более читабельно)

  • Лучше всего проверить, что ваша команда sedработает должным образом, сначала запустив ее без опции -i/ --in-place, чтобы можно было проверить вывод на наличие ошибок, вместо того, чтобы перезаписывать файл потенциальными ошибками.
0
28.04.2021, 23:24

Теги

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