Как я использовал sed -i для редактирования переменных шаблонов? - PullRequest
1 голос
/ 15 октября 2019

Я использую sed для редактирования некоторых данных в файле. И шаблон, который меня интересует, выглядит следующим образом:

XXXA
YYYA
ZZZA

Я просто хотел добавить \t между буквой А и всем, что находится перед ним. Так что это будет выглядеть примерно так:

XXX A
YYY A
ZZZ A

Поскольку XYZ отличается в каждом файле, и я не хочу подсаживать каждый из них тысячи раз. Поэтому я подумал, что могу использовать ... в качестве шаблона для представления чего-либо перед A.

Итак, я попробовал вот что:

sed -i 's/...A/...\tA/' myfile.txt

Но это изменилоXXXA, YYYA, ZZZA до "... A", "... A", "... A". Так что мне интересно, есть ли способ, которым я могу использовать sed, чтобы сделать это, и держать что-либо перед A таким же ??

Помощь очень ценится

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Вам нужно захватить 3 символа и использовать обратную ссылку в шаблоне замены:

sed -Ei 's/(...)A/\1\tA/' myfile.txt

В этой команде () вокруг части шаблона поиска определяет группу захвата, содержимое которой выВы сможете ссылаться либо в шаблоне поиска, чтобы убедиться в наличии одного и того же контента в двух местах, либо в шаблоне замены, чтобы повторить часть того, что вы нашли.

* \1в шаблоне замены есть ссылка на первую группу захвата (в нашем случае единственную, которую мы определили).

Я использую -E RE регулярное выражение, чтобы избежать необходимости избегать скобок группировки, но sed -i 's/\(...\)A/\1\tA/' myfile.txt было бы эквивалентно.

Кроме того, вы можете добавитьякоря, чтобы убедиться, что вы заменили целую строку, а не часть строки, которая содержит A после трех других символов:

sed -Ei 's/^(...)A$/\1\tA/' myfile.txt

Вы можете попробовать здесь .

0 голосов
/ 15 октября 2019

«Я просто хотел добавить \ t между буквой А и всем, что перед ней». Тогда мы идем:

sed -i 's/A$/\tA/' test.txt
...