У меня сотни файлов .htm, и мне нужно заменить <title>sometext</title>
фактическим именем файла. Например: у меня есть файл с именем records-england.htm
, и мне нужно заменить <title>sometext</title>
в этом файле таким именем, как <title>records-england.htm</title>
Даже лучше, если без расширения - но это не важно. Я пробовал вот так, но это не работает:
find . -name *.htm | while read file; do sed "s|<title>sometext</title>|<title>$file</title>|g" {} \; done
Любой совет?
5 ответов
Вы можете использовать имя файла awk
. Должно быть gnu awk
> = 4.1
из-за -i inplace
awk -i inplace '{a=FILENAME;sub(/\.htm$/,"",a);gsub(/<title>[^<]*<\/title>/,"<title>"a"</title>")}1' *.htm
Это изменит <title>sometext</title>
(где sometext
может быть любым) на <title>filename(without extension)</title>
Попробуй вот так
's/\<title\>.*\<title\>/title>$file<title/g'
Чтобы исправить проблему в вашем коде, вы можете попробовать следующее:
find -name "*.htm" | while read file; do sed "s|<title>sometext</title>|<title>${file##*/}</title>|g" -i $file; done
Sed нужен параметр -i, чтобы указать, какие файлы вы хотите редактировать, и я использую расширение параметра, чтобы отображать только базовое имя файла.
Это будет работать для любого произвольного текста заголовка. Если вы не хотите, чтобы это был какой-то текст, а какой-то фиксированный, измените <title>.*</title>
на <title>sometext</title>
.
find -type f -name '*.htm' -printf '%P\0%f\0' | xargs -0 -n2 sh -c 'fil="${2/\.htm/}"; sed -i -e "s;<title>.*</title>;<title>$fil</title>;" $1' replace
Он передает результат find
в sh
с помощью xargs
; bash
удаляет расширение и передает аргументы sed
, который выполняет замену.
< STRONG> Аргументы:
Кому find
-type f
найти файлы-name '*.htm'
с расширениемhtm
printf '%P\0%f\0'
выводит полный путь к файлу, затем ASCII null, за которым следует только имя файла (без пути) и снова ASCII nul
Кому xargs
-0
использовать ASCII nul в качестве разделителя-n2
выбирает не более 2 аргументов из списка для каждого выполнения команды
Кому sh
-c
читает команды из первого аргумента, не являющегося параметром- сценарий bash, который принимает
$1
(путь к файлу) и$2
(имя файла) в качестве аргументов; выполняет замену регулярного выражения, чтобы обрезать расширение. Передача фиктивной строкиreplace
для получения$0
Кому sed
-i
заменить на месте в файле-e
сценарий для выполнения
Вы также можете попробовать это:
#!/bin/bash
outFile=/tmp/myOutFile.out
touch $outFile
while read line
do
name=$line
echo "<title>$name</title>" >> $outFile
done < $1
- Создайте новый файл .sh (например, modifyFile.sh) с кодом выше.
- Предоставьте ему права на выполнение - chmod + x modifyFile.sh
- Запустите его с файлом, который содержит ваши имена файлов, или w / e - ./modifyFile.sh myInputFile.txt
- Вы получите результаты в /tmp/myOutFile.out
Похожие вопросы
Новые вопросы
linux
ВНИМАНИЕ: Все вопросы по Linux должны быть связаны с программированием; те, которые не будут закрыты. Используйте этот тег, только если ваш вопрос касается программирования с использованием API-интерфейсов Linux или поведения, специфичного для Linux, а не только потому, что вы запускаете свой код в Linux. Если вам нужна поддержка Linux, вы можете попробовать https://unix.stackexchange.com или сайт Stack Exchange конкретного дистрибутива Linux, например https://askubuntu.com или https://elementaryos.stackexchange.com/.