Попробуйте
awk -F\| -vOFS=\| 'NR==2 {sub (/_[^_]*\./,".", $2)}1' file
No|filename|count
01 |com_101_00000_0001.txt|100
NR==2 if record count is 2 (i.e. 2. line)
sub ( `awk` "substitute" function
/_[^_]*\./ regex: match string consisting of multiple non-underscores, delimited by leading underscore and trailing literal dot
,".", with a literal dot
$2) in second field
1 do default action: print
Перенаправление >
во временный файл и mv
/ cp
обратно в исходный файл, если это необходимо. Для нескольких файлов запустите цикл for
для всех соответствующих файлов.
Если вы хотите заменить строку foo
на bar
, вы можете использовать это:
#!/bin/bash
# the pattern we want to search for
search="foo"
# the pattern we want to replace our search pattern with
replace="bar"
# my file
my_file="/path/to/file"
# generate a new file name if our search-pattern is contained in the filename
my_new_file="$(echo ${my_file} | sed "s/${search}/${replace}/")"
# replace all occurrences of our search pattern with the replace pattern
sed -i "s/${search}/${replace}/g" "${my_file}"
# rename the file to the new filename
mv "${my_file}" "${my_new_file}"
Имейте в виду, что если шаблон поиска соответствует частям слова, эти части также заменяются, например.:
«У меня есть гусеница».
со строкой поиска «кошка» и строкой замены «собака» станет
«У меня есть догерпиллар».
Избежать этого, к сожалению, не совсем тривиально.