заменить текст между указанными c вхождением разделителя, только если он пуст - bash - PullRequest
1 голос
/ 09 апреля 2020

Уважаемые,

В приведенной ниже строке "|" является разделителем в файле. Если дата между 19-м и 20-м вхождением пуста, замените ее текущей датой для всех строк в файле.

227354|SD-PD-100456|P-OD-98767318712|ABC|O|EN|UJ|NM|ABC|ABC;ABC;ABC||98765432||I|A||01/04/2019||||06/04/2020||JU|HINB

sed -i "s/\(\([^|]*|\)\{19\}\)[^|]*/\1$(date '+%d\/%m\/%Y')/g" *

с помощью этой команды я могу заменить текст между 19-м и 20-м разделителем, однако я не понимаю, как заменить его, только если он пуст.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

awk больше подходит для этой работы:

awk -v dt=$(date '+%d/%m/%Y') 'BEGIN{FS=OFS="|"} $20 == ""{$20=dt} 1' file

227354|SD-PD-100456|P-OD-98767318712|ABC|O|EN|UJ|NM|ABC|ABC;ABC;ABC||98765432||I|A||01/04/2019|||09/04/2020|06/04/2020||JU|HINB

Подробности:

  • -v dt=$(date '+%d/%m/%Y'): Отправить date в качестве аргумента командной строки на awk в переменной dt
  • BEGIN{FS=OFS="|"}: установить | в качестве входных и выходных разделителей
  • $20 == "": столбец If 20 пусто
  • {$20=dt}: устанавливает значение переменной $20 dt
  • 1: действие по умолчанию для печати строки
1 голос
/ 09 апреля 2020

Если вас интересует пробел, ищите пробел:

sed -i "s/\(\([^|]*|\)\{19\}\)|/\1$(date '+%d\/%m\/%Y')|/" filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...