Заменить пробелы во всех файлах в каталоге подчеркиванием - PullRequest
0 голосов
/ 11 июня 2018

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

Я не хочу переименовывать файлы, просто измените их на месте.

Редактировать: Чтобы уточнить, на всякий случай, если неясно, я хочу заменить только пробел в файлах, файлимена не должны быть изменены.

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Ну ... так как я пытался запустить что-то, я нашел метод, который работал для меня:

for file in `ls`; do sed -i 's/ /_/g' $file; done
0 голосов
/ 11 июня 2018

Это проблема из 2 частей.Шаг 1 предоставляет правильную команду sed, 2 предоставляет правильную команду для замены всех файлов в данном каталоге.

Подстановка в командах sed имеет вид s/ItemToReplace/ItemToReplaceWith/pattern, где s обозначает замену иpattern обозначает, как должна выполняться операция. Согласно этому сообщению суперпользователя , для совпадения пробельных символов вы должны использовать либо \s, либо [[:space:]] в вашей команде sed.Разница в том, что позже - для соответствия POSIX.Наконец, вам нужно указать глобальную операцию, которая просто / g в конце.Это просто заменяет все пробелы в файле подчеркиванием.Подстановка в командах sed имеет вид s/ItemToReplace/ItemToReplaceWith/pattern, где s обозначает замену, а pattern обозначает, как должна выполняться операция. Согласно этому сообщению суперпользователя , для сопоставления пробельных символов вы должны использовать либо просто пробел в вашей команде sed, \s, либо [[:space:]].Разница между последними двумя значениями заключается в перехвате пробелов (табуляции и пробелов), причем последнее необходимо для соответствия POSIX.Наконец, вам нужно указать глобальную операцию, которая просто / g в конце.

Следовательно, ваша команда sed -

Однако это выполняет только половину вашей задачи.Вы также должны быть в состоянии сделать это для каждого файла в каталоге.К сожалению, подстановочные знаки не спасут нас в команде sed, так как * > * будет неоднозначным.Ваше единственное решение - перебирать каждый файл и перезаписывать их по отдельности. Для циклов по умолчанию должен быть предусмотрен синтаксис итерации файлов , а при использовании с подстановочными знаками распространяется на все файлы в каталоге.Однако sed, используемый таким образом, похоже, полностью теряет вывод при перенаправлении в файл.Чтобы исправить это, вы должны указать sed с флагом -i, чтобы он редактировал свои файлы.Любой элемент, который вы передадите после флага -i, будет использован для создания резервной копии старых файлов.Если расширение не передано (например, -i ''), резервное копирование не будет создано.

Поэтому последняя команда должна быть просто

, которая ищет все файлы в текущем каталоге и выводитВывод sed во все файлы (каталоги отображаются в списке, но с ними не происходит никаких действий).

0 голосов
/ 11 июня 2018
find . -type f -exec sed -i -e 's/ /_/g' {} \;

find захватывает все элементы в каталоге (и подкаталогах), которые являются файлами, и передает эти имена файлов в качестве аргументов команде sed, используя нотацию {} \;.Команда sed, кажется, вы уже поняли.

если вы хотите только искать в текущем каталоге и игнорировать подкаталоги, вы можете использовать

find . -maxdepth 1 -type f -exec sed -i -e 's/ /_/g' {} \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...