Sed удаление последних 4 символов в тексте файла внутри папки

#linux

Вопрос:

Это проблема Linux, поэтому мне нужно создать папку под названием «Заметки», и в этой папке мне нужно создать 6 файлов. Файлы именуются с помощью идентификационного номера следующим образом:

  • a00144998.txt
  • a00154667.txt
  • a00130933.txt
  • a00143561.txt
  • a00157888.txt

Первые 3 буквы всегда «a00″, а 4-я и 5-я буквы-это год. Поэтому теперь мне нужно скопировать идентификационный номер/название файла без расширения». txt» и вставить его в новый файл за пределами папки «Примечания» Пример файла a00144998, в нем указан 14-й год(из 4-й и 5-й буквы), поэтому я скопирую a00144998 в новый файл с именем «year14.txt» и разберись с этим. Так же, как и a00154667, он показывает 15-й год, поэтому я скопирую a00154667 в новый файл с именем «year15.txt». Итак, в конце, файл «year14.txt» придется :

 a00143561
a00144998
 

Я нашел код, и он работает, если файлов нет в папке. Но как только я создаю файлы внутри папки, этот код не работает, он продолжает копировать расширение txt. Есть идеи? Спасибо!

 ls ~/Notes/???14????.txt|sed 's/.[4]$//'|sort>year14.txt
 

Ответ №1:

В этом нет необходимости , вы можете сделать все это за один раз. sed :

 for f in a0014*.txt; do echo ${f:5:4}; done | sort > year14.txt
 

Это будет перебирать a0014*.txt каждый файл, соответствующий глобусу, и помещать каждую строку в f переменную, повторяя 4 символы, начинающиеся после символа 5 th.

В TLDP есть отличное руководство по манипулированию строками в bash.

Вам также следует избегать синтаксического ls анализа . Он должен быть человеческим, а не машиночитаемым.