Regex Sed Issue - PullRequest
       14

Regex Sed Issue

0 голосов
/ 21 мая 2018

Мое выражение sed выглядит следующим образом:

sed -i "s/-D CONSOLELOG /-D CONSOLELOG  -fPIC /g" makefile.init

makefile.init

 CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG  

Вывод после 1-го запуска (как и ожидалось)

CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG  -fPIC

2-й запуск(Обратите внимание на дополнительный fPIC в конце)

CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG  -fPIC -fPIC

Мне нужно изменить выражение sed, чтобы получить вывод, как в (1), независимо от того, сколько раз он был выполнен

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Образец изменен в целях иллюстрации

$ cat ip.txt 
42 foo baz 
ijk baz xyz
$ sed -i 's/baz $/&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz xyz

$ # further runs won't change input
$ sed -i 's/baz $/&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz xyz
  • $ - это метасимвол, обеспечивающий совпадение только в конце строки
  • , поэтому совпадения в любом другом месте строки выиграны 'не может быть изменено, и, следовательно, повторное применение команды не приведет к дублированию
  • & в разделе замены есть обратная ссылка на всю совпавшую строку в разделе поиска
  • , так как может быть только одно совпадение вконец строки, модификатор g не требуется


Для замены в любом месте строки (при условии, что в строке будет только одно совпадение)

$ cat ip.txt 
42 foo baz 
ijk baz xyz
$ sed -i '/baz 123/! s/baz /&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz 123xyz

$ # further runs won't change input
$ sed -i '/baz 123/! s/baz /&123/' ip.txt
$ cat ip.txt
42 foo baz 123
ijk baz 123xyz
  • *Для команд 1022 * можно указать адресацию
  • здесь, /baz 123/! означает строки не соответствие baz 123


Дальнейшее чтение: Разница между одинарными и двойными кавычками в Bash

0 голосов
/ 21 мая 2018

Это может сработать для вас (GNU sed):

sed -ri 's/-D CONSOLELOG (-fPIC )?$/&-fPIC /' file

Будет вставлено не более 2 -fPIC параметров после параметра -D CONSOLELOG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...