Как изменить слова после совпадения с косой чертой - PullRequest
1 голос
/ 20 февраля 2020

Внутри моего файла "input.txt" у меня написан следующий путь:

"/home/inputfiles/water_gen/5202_water.gen"

Я хочу изменить "5202" указанными c числами (вероятно, используя для l oop) и сохранить их как разные файлы.

Я подумал, что проще всего было бы использовать sed, чтобы найти "water_gen /" в качестве совпадения, а затем изменить остальные.

Но есть ли более простой подход? У меня были проблемы из-за sla sh.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Это может сработать для вас (GNU sed & parallel):

parallel --dry sed -E 's/[0-9]+/{1}/' {2} \> {2.}{1}.txt ::: {1000..1005} ::: file.txt

Это создает набор команд для замены первой группы чисел в file.txt на 1000 на 1005 и записи результаты до file1000.txt до file1005.txt.

После проверки набора команд удалите опцию --dry short для --dry-run и перезапустите.

NB Исходный файл не изменено.

Подстановка может быть более точной c, то есть:

parallel sed -E \''s#(/home/inputfiles/water_gen/)5202(_water.gen)#\1{1}\2#'\' {2} \> {2.}{1}.txt ::: {1000..1005} ::: file.txt

NB. Кавычки команды sed заключены в кавычки \', так что обратные ссылки не будут приняты за вещи в оболочке.

Или, чуть меньше, укажите c:

parallel sed -E \''s#(/home/inputfiles/water_gen/)[0-9]+(_water.gen)#\1{1}\2#'\' {2} \> {2.}{1}.txt ::: {1000..1005} ::: file.txt

Номера замены могут быть в файле:

cat <<\! > replacementsFile
1000
1001
1002
1003
1004
1005
!
parallel sed -E \''s#(/home/inputfiles/water_gen/)5202(_water.gen)#\1{1}\2#'\' {2} \> {2.}{1}.txt :::: replacementsFile ::: file.txt
1 голос
/ 20 февраля 2020

Я предполагаю, что вы хотите использовать sed. Это также можно решить с помощью awk.

Вы можете просто заменить префикс части базового имени (имя файла) пути. Приведенные ниже фрагменты будут редактировать файл на месте:

NUM=0005
sed -Ei 's/(\/home\/inputfiles\/water_gen\/)[0-9]+(_water\.gen)/\1'"$NUM"'\2/' input.txt
cat input.txt
/home/inputfiles/water_gen/0005_water.gen

Вы также можете обобщать суффикс имени файла вместо жесткого его кодирования, в зависимости от вашей проблемы. Пока я предполагаю, что этого достаточно.

Если вы хотите запустить это в al oop, выполните

for NUM in $(seq -f "%04g" 0 5); do
    sed -Ei 's/(\/home\/inputfiles\/water_gen\/)[0-9]+(_water\.gen)/\1'"$NUM"'\2/' input.txt;
    cat input.txt
done
/home/inputfiles/water_gen/0000_water.gen
/home/inputfiles/water_gen/0001_water.gen
/home/inputfiles/water_gen/0002_water.gen
/home/inputfiles/water_gen/0003_water.gen
/home/inputfiles/water_gen/0004_water.gen
/home/inputfiles/water_gen/0005_water.gen
0 голосов
/ 20 февраля 2020

Если эта часть 5202 известна, то изменить ее напрямую

sed -i 's/5202/153/' input.txt

Если не использовать regexp

sed -i 's/[0-9]\+/153/' input.txt
...