Sed: найти, заменить, а затем добавить результат в исходную строку - PullRequest
1 голос
/ 18 апреля 2020

Я нахожусь на Ма c, я хочу найти шаблон в строках, заменить его чем-то, а затем добавить полученную строку в конец исходной строки. Вот что я попробовал:

echo "test='123'" | sed -E  '/([^a-z])/ s/$/ \1/' 

sed: 1: "/([^a-z])/ s/$/ \1/": \1 not defined in the RE

Что мне нужно определить \1? Я думал, что сделал это с ([^a-z]). Нет?

Редактировать: Возможно, этот код будет лучше представлять то, что я хочу:

1) echo "test='123'" | sed 's/[a-zA-Z0-9]//g'

2) Я хочу новую строку = исходная строка + строка # 1 выше

Другими словами:

До (что я получаю): test='123'

После (что я хочу): test='123' =''

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете редактировать эту команду следующим образом:

echo "test='123'" | sed -E 'h;s/([a-zA-Z0-9])//g;G;s/(.*)\n(.*)/\2\1/'

Для удобства чтения сценарий, строка за строкой, читает

h
s/([a-zA-Z0-9])//g
G
s/(.*)\n(.*)/\2\1/
  • h сохраняет текущую строку в области удержания
  • ваша команда s делает то, что делает
  • G добавляет содержимое области удержания, т.е. исходную строку, к пространству образца, то есть текущему строки, как вы ее отредактировали, поместив между строкой новую строку \n.
  • другая команда s переупорядочивает две части, а также удаляет \n, вставленный командой G.

Комментарии

  • Ваша первоначальная попытка sed -E '/([^a-z])/ s/$/ \1/' не сработала, поскольку \1 относится к тому, что захвачено самой левой (…) группой в поисковой части s команда , она не «запоминает» группы, которые вы использовали для адресации строки.
  • Как только вы печатаете пространство шаблона с помощью p, появляется новая строка, и один раз он был распечатан, вы не сможете удалить его из одной и той же программы sed. * 10 37 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...