botaniQQQ
@botaniQQQ
Q

Как найти и заменить второе вхождение?

Привет.

hello.txt
hello: ""
hello: ""
hello: ""

Нужно сделать вставку во второй элемент.
hello: ""
hello: "world"
hello: ""

Данный код делает замену первого вхождения.
sed -i "s/hello: \"\"/hello: \"world\"/" hello.txt
Данный код делает замену всех вхождений.
sed -i "s/hello: \"\"/hello: \"world\"/g" hello.txt

Каким образом сделать только второго вхождения?
  • Вопрос задан
  • 2758 просмотров
Решения вопроса 2
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Примерно так:
sed ':a;N;$!ba;s/""/"world"/2'

, где двоеточие - определение метки с именем a;
N - добавить новую строку к pattern space;
$ - к последней строке;
! - применить;
b - переход к метке, в данном случае к метке a;
s - поиск и замена;
/""/ - что ищем, в данном случае пустые кавычки;
"world" - на что заменить найденное совпадение, в данном случае на "world";
/2 - замена второго совпадения.

echo "hello: \"\"
hello: \"\"
hello: \"\"" | sed ':a;N;$!ba;s/""/"world"/2'

Еще можно такой вариант попробовать:

sed '2s/""/"world"/1'
Ответ написан
@abcd0x00
text="\
abc
hello: \"\"
def
hello: \"\"
ghi
hello: \"\"
jkl
hello: \"\"
mno\
"

echo "$text"

echo "$text" | sed '
  /hello: ""/ {
    x
    /^\.$/ {
      x
      s/""/"world"/
      x
    }
    s/^/./
    x
  }
'


Вывод
[guest@localhost sh]$ text="\
> abc
> hello: \"\"
> def
> hello: \"\"
> ghi
> hello: \"\"
> jkl
> hello: \"\"
> mno\
> "
[guest@localhost sh]$ 
[guest@localhost sh]$ echo "$text"
abc
hello: ""
def
hello: ""
ghi
hello: ""
jkl
hello: ""
mno
[guest@localhost sh]$ 
[guest@localhost sh]$ echo "$text" | sed '
>   /hello: ""/ {
>     x
>     /^\.$/ {
>       x
>       s/""/"world"/
>       x
>     }
>     s/^/./
>     x
>   }
> '
abc
hello: ""
def
hello: "world"
ghi
hello: ""
jkl
hello: ""
mno
[guest@localhost sh]$

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы