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
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
replace|everyevery|every|one|
replace|replace|replace|replace|123|abc|123|abc
Просто пройдитесь по полям и проверьте, совпадают они или нет:
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