строки замены в тексте с совпавшим текстом

[112494]Проблема заключается в неправильном цитировании. [113003]"[113004] не цитирует (и, что является проблемой здесь, не удаляется!), если она содержится в переменной. Исключение: [113005]eval $text[12216]Вы должны присвоить параметры массиву и вместо этого использовать [113007]ls "${vars[@]}"[113008] или [113009]ls "$@"[113010].[12217]Сравните два вызова:[12218]
1
30.07.2014, 13:20
2 ответа
sed 's/[^|]*everyone[^|]*/this is what I want to see/g' <<\DATA
123|abc|heloo good morning friends|1|123|abc|123|abc                       
123|abc|heloo good morning everyone|1|123|abc|123|abc
DATA

OUTPUT

123|abc|heloo good morning friends|1|123|abc|123|abc
123|abc|this is what I want to see|1|123|abc|123|abc

Это соответствует любому случаю каждого и всей последовательности слева или справа от него до, но не включая разделитель |. Таким образом, все вышесказанное работает. Но так же как и:

sed 's/[^|]*everyone[^|]*/replace/g' <<\DATA
everyone|everyevery|every|one|                                             
everyone|everyone|heloo good morning everyone|everyone|123|abc|123|abc
DATA

OUTPUT

replace|everyevery|every|one|
replace|replace|replace|replace|123|abc|123|abc
1
27.01.2020, 23:17

Просто пройдитесь по полям и проверьте, совпадают они или нет:

awk 'BEGIN{FS=OFS="|"}
     {for (i=1; i<=NF; i++)
           if ($i ~ "everyone") $i="this is what i want to see"
      print}' file

См. вывод:

$ awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) if ($i ~ "everyone") $i="this is what i want to see"; print}' file
123|abc|heloo good morning friends|1|123|abc|123|abc
123|abc|this is what i want to see|1|123|abc|123|abc

В более идиоматическом виде условие if может быть записано как ($i ~ "все") &&$i="это то, что я хочу видеть", а затем просто используйте истинное условие для печати строк:

awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) ($i ~ "everyone") && $i="this is what i want to see"} 1' file
4
27.01.2020, 23:17

Теги

Похожие вопросы