Intereting Posts
Как сделать $ ORIGIN в RPATH не следовать символическим ссылкам? Два массива имеют немного другой размер массива с одинаковыми размерами дисков / разделов, почему? Генерировать прерывания для целей стресс-тестирования Как предотвратить закрытие приложения python в Linux? UUID на основе глобального MAC-адреса Как перезагрузить контейнеры докеров (в определенном порядке) автоматически при каждой перезагрузке в Ubuntu 14.04 Оптимизация загрузки Systemd dev-mmcblk0p2.device Как я могу проверить, какие части POSIX использует приложение? Mate настольные разрывы без панелей и десятки окон caja при переключении пользователей? Как bash изменяет экологические переменные на лету? POSIX-описание cp -R cd 3 раза до прадедушки Как установить DPI на экране Hi-Res? Значение по умолчанию слишком маленькое Как получить IP-адрес с помощью сценария оболочки? inputrc неправильно загружается

замените '_' на ',' в файле, который содержит список имен файлов

Мне будет полезно, если кто-то может помочь написать сценарий оболочки для выполнения следующего требования.

У меня есть текстовый файл, который содержит список имен файлов, как показано ниже:

ADB_AR_2006_07.pdf ADBL_AR_2010_11.pdf CBL_AR_2013_14.pdf CZBIL_AR_2007_08.pdf BOKL_AR_2015_16.pdf .. .. 

Теперь я хочу заменить первый и второй «_» на «,» для всех имен файлов, перечисленных в текстовом файле. Так что имена файлов становятся:

 ADB,AR,2006_07.pdf ADBL,AR,2010_11.pdf CBL,AR,2013_14.pdf CZBIL,AR,2007_08.pdf BOKL,AR,2015_16.pdf .. .. 

Вы можете использовать простое выражение sed :

 sed -Ei 's/^([^_]+)_([^_]+)_/\1,\2,/' file 

содержимое file после изменения:

 ADB,AR,2006_07.pdf ADBL,AR,2010_11.pdf CBL,AR,2013_14.pdf CZBIL,AR,2007_08.pdf BOKL,AR,2015_16.pdf 

  • i – разрешает модификацию файла на месте

  • -E – позволяет расширенные регулярные выражения


Упрощенный подход будет выглядеть так:

 sed -i 's/_/,/; s/_/,/' file 

Простой скрипт python

 #!/usr/bin/env python from __future__ import print_function import sys with open(sys.argv[1]) as f: for line in f: tokens=line.strip().split('_') print(",".join(tokens[0:3]),'_',tokens[3],sep='') 

Основная идея заключается в том, что мы читаем файл по строкам, разбиваем его на части в разделителе _ и объединяем первые 3 элемента с помощью _ в строку с использованием нотации среза [0:3] . Если вам нужно сохранить этот вывод как файл, используйте > оператор оболочки и отправьте вывод в файл.

Контрольная работа:

 $ ./edit_lines.py input.txt ADB,AR,2006_07.pdf ADBL,AR,2010_11.pdf CBL,AR,2013_14.pdf CZBIL,AR,2007_08.pdf BOKL,AR,2015_16.pdf 

Решение с awk :

 $ awk -F"_" '{ print $1","$2","$3"_"$4}' list ADB,AR,2006_07.pdf ADBL,AR,2010_11.pdf CBL,AR,2013_14.pdf CZBIL,AR,2007_08.pdf BOKL,AR,2015_16.pdf