Заменить несколько определенных вхождений на sed

Возможно, слишком поздно, но три обратной косой черты перед #сработали для меня.

Если пароль такой, скажите "admin #123", вы можете определить его как

admin\\\#123
1
29.07.2020, 10:53
2 ответа

Не думаю. В sed нет таких вещей, как поля, поэтому вам придется выполнять жесткий подсчет с помощью регулярных выражений. Это можно сделать,но не изящно:

r='1970-01-01 00:00:00.00+0000'
sed -E "s/^([^,]*,)<n>/\1$r/;s/^(([^,]*,){3})<n>/\1$r/;s/<n>/0/g" file

(Вы можете взглянуть на Использование \1 для сохранения части шаблона , если вы не знаете обратных -ссылок.)

Awk можно очистить, установив переменные оболочки, как я сделал выше, в sed, которые затем передаются в awk. Итак, ваш awk-скрипт теперь содержит в основном только логику:

r='1970-01-01 00:00:00.00+0000'
m='<n>'
awk 'BEGIN{FS=OFS=","}{sub(m,r,$2);sub(m,r,$4);gsub(m,"0")}1' r="$r" m="$m" file

Чуть короче:

awk -F, '{sub(m,r,$2);sub(m,r,$4);gsub(m,"0")}1' OFS=, r="$r" m="$m" file
1
18.03.2021, 23:16

Нет, с помощью sed это нельзя сделать более элегантно, но вот более элегантный способ сделать это в awk:

$ awk '
    BEGIN { FS=OFS=","; n="<n>"; r="1970-01-01 00:00:00.00+0000" }
    { for (i=2;i<=4;i+=2) if ($i == n) $i=r; gsub(n,0) }
1' file
380670000001,1970-01-01 00:00:00.00+0000,0,1970-01-01 00:00:00.00+0000,0,0,0,0,0
1
18.03.2021, 23:16

Теги

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