Команда sed 's/\(.*\)\1/\1/'
заменит все дублированные строки одной строкой, не требуя определенной части имени файла, такой как .txt
. Он допускает пробелы в строке.
Пример:
echo 'abc defabc def' | sed 's/^\(.*\)\1$/\1/'
печатает
abc def
Объяснение команды sed
:
^
привязывает шаблон к началу строки .*
- это 0 или более вхождений любого символа \(
... \)
фиксирует то, что соответствует шаблону между \1
- ссылка на первую группу захвата, т. е. текст, найденный до $
, привязывает шаблон поиска к концу строки
В результате шаблон поиска, который соответствует целой строке, состоящей из любого текста, за которым следует тот же текст.
\1
в замене - это та же ссылка на сопоставленный текст т. е. единственное вхождение дублированного текста.
Любые входные данные, которые не соответствуют шаблону, останутся без изменений.
Если вы хотите переименовать все файлы в текущем каталоге, вы можете используйте это следующим образом
for file in *
do
new=$(echo $file|sed 's/\(.*\)\1/\1/')
[ "$file" = "$new" ] || mv "$file" "$new"
done
В качестве команды sed
d Если не изменить несоответствующий ввод, $new
будет таким же, как $file
для имен файлов, которые не состоят из дублированной строки. Это может привести к сообщению об ошибке от mv
. Поэтому в этом случае переименование будет пропущено.