Sed не заменяет значения в файле

#regex #shell #awk #sed

Вопрос:

Имейте файл со следующими данными в нем:

файл выборки:

 id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
NoData|N|6ypXQwLw8H9svA|04271|NoData
NoData|N|7MFzlQriUjohVg|60475|NoData
NoData|N|8AtEVeaU3fiK5w|91305|NULL
NoData|N|AA3B5BNqNTokWw|87818|NoData
NoData|N|CG79LhAgIeBkPw|80199|NULL
 

Использование sed для замены NoData , NULL и N :

     sed -i "s/\\N//g" samplefile
    sed -i "s/x0//g" samplefile
    sed -i "s/NoData//g" samplefile
 

Фактический результат:

 id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
NoData|N|6ypXQwLw8H9svA|04271|NoData
NoData|N|7MFzlQriUjohVg|60475|NoData
NoData|N|8AtEVeaU3fiK5w|91305|NULL
NoData|N|AA3B5BNqNTokWw|87818|NoData
NoData|N|CG79LhAgIeBkPw|80199|NULL
 

ожидаемый результат:

 id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
||6ypXQwLw8H9svA|04271|
||7MFzlQriUjohVg|60475|
||8AtEVeaU3fiK5w|91305|
||AA3B5BNqNTokWw|87818|
||CG79LhAgIeBkPw|80199|
 

Не понимаю, что не так или отсутствует в sed команде, что она не дает желаемого результата.

Обновление результатов тестирования после реализации предложений:

  1. Предложение_1:

    sed -Ei 's/\N|NULL|NoData//g' samplefile

     id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
    6ypXQwLw8H9svA|04271
    7MFzlQriUjohVg|60475
    8AtEVeaU3fiK5w|91305
    AA3B5BNqNTokWw|87818
    CG79LhAgIeBkPw|80199
     
  2. Предложение_2:

    awk 'BEGIN{FS=OFS="|"} NR>1{$1=$2=$5=""} 1' samplefile

     id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
    6ypXQwLw8H9svA|04271
    7MFzlQriUjohVg|60475
    8AtEVeaU3fiK5w|91305
    AA3B5BNqNTokWw|87818
    CG79LhAgIeBkPw|80199
     

Тем не менее, это не соответствует ожидаемому результату. Есть ли способ сохранить разделители и заменить значения просто пробелом?

Комментарии:

1. NoData != NoValue и x0 != NULL

2. также используйте одиночные кавычки, если вам не нужны замены оболочки в содержимом. sed -Ei 's/\N|NULL|NoData//g' thefile

3. Почему бы просто не удалить содержимое 1-го, 2-го и 5-го полей с awk 'BEGIN{FS=OFS="|"} NR>1{$1=$2=$5=""} 1' file помощью ?

4. Я протестировал его, и он действительно работает. (за исключением того NULL , что в файле остаются буквы s) Проверьте, не допустили ли вы опечатку в имени файла.

5. ваш sed , похоже, ошибается, если он также захватывает символ трубы. Какую версию вы используете? ( try sed --version )

Ответ №1:

Тестирование вашего кода Suggestion_2 из комментария @EdMorton в GNU awk получает expected result :

 awk 'BEGIN{FS=OFS="|"} NR>1{$1=$2=$5=""} 1' file                                     id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
||6ypXQwLw8H9svA|04271|
||7MFzlQriUjohVg|60475|
||8AtEVeaU3fiK5w|91305|
||AA3B5BNqNTokWw|87818|
||CG79LhAgIeBkPw|80199|
 

Версия GNU awk:

 awk --version
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1)
....
 

и тот же результат с sed комментарием от @jthill:

 sed  -E 's/(\N|NULL|NoData)//g' file         id|mdl_name|mdl_tagid|mdl_brnchcd|mdls_mktvl
||6ypXQwLw8H9svA|04271|
||7MFzlQriUjohVg|60475|
||8AtEVeaU3fiK5w|91305|
||AA3B5BNqNTokWw|87818|
||CG79LhAgIeBkPw|80199|
 

Это может помочь: https://unix.stackexchange.com/questions/145402/regex-alternation-or-operator-foobar-in-gnu-or-bsd-sed