Замена первого вхождения матча на седь - PullRequest
2 голосов
/ 05 февраля 2012

Я выполняю поиск и заменяю на sed, заменяя переменную BASH $a (в начале новой строки) переменной BASH $b:

sed -i "s#^$a#$b#" ./file.txt

Это заменяет всесоответствует для ^$a.Как я могу заменить только первое вхождение ^a во всем файле?

Ответы [ 3 ]

5 голосов
/ 05 февраля 2012

В одну сторону, используя sed:

sed "s/^$var1/$var2/ ; ta ; b ; :a ; N ; ba" infile

Пояснение:

s/^$var1/$var2/             # Do substitution.
ta                          # If substitution succeed, go to label `:a`
b                           # Substitution failed. I still haven't found first line to 
                            # change, so read next line and try again.
:a                          # Label 'a'
N                           # At this position, the substitution has been made, so begin loop
                            # where I will read every line and print until end of file.
ba                          # Go to label 'a' and repeat the loop until end of file.

Тест с тем же примером, предоставленным Jaypal:

Содержимое infile:

ab aa
ab ff
baba aa
ab fff

Запустите команду:

sed "s/^$var1/$var2/ ; ta ; b ; :a ; N ; ba" infile

И результат:

bb aa
ab ff
baba aa
ab fff
4 голосов
/ 05 февраля 2012

Это должно работать:

sed -i "0,/^\$a/s//\$b/" ./file.txt

Подробнее об этом можно прочитать на http://www.grymoire.com/Unix/Sed.html#toc-uh-29

1 голос
/ 05 февраля 2012

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

 sed -i 'x;/^./{x;b};x;/^'"$a"'/{s//'"$b"'/;h}' file

Или:

 sed -i ':a;$!{N;ba};s/^'"$a/$b"'/m' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...