У меня сотни файлов .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

Любой совет?

0
Jaur 5 Мар 2015 в 11:47

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>

1
Jotne 5 Мар 2015 в 09:12

Попробуй вот так

's/\<title\>.*\<title\>/title>$file<title/g'
0
Alex 5 Мар 2015 в 08:54

Чтобы исправить проблему в вашем коде, вы можете попробовать следующее:

find -name "*.htm" | while read file; do sed "s|<title>sometext</title>|<title>${file##*/}</title>|g" -i $file; done

Sed нужен параметр -i, чтобы указать, какие файлы вы хотите редактировать, и я использую расширение параметра, чтобы отображать только базовое имя файла.

1
FrenchieTucker 5 Мар 2015 в 09:11

Это будет работать для любого произвольного текста заголовка. Если вы не хотите, чтобы это был какой-то текст, а какой-то фиксированный, измените <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 сценарий для выполнения
0
legends2k 5 Мар 2015 в 11:54

Вы также можете попробовать это:

#!/bin/bash
outFile=/tmp/myOutFile.out
touch $outFile
while read line
do
    name=$line
    echo "<title>$name</title>" >> $outFile
done < $1
  1. Создайте новый файл .sh (например, modifyFile.sh) с кодом выше.
  2. Предоставьте ему права на выполнение - chmod + x modifyFile.sh
  3. Запустите его с файлом, который содержит ваши имена файлов, или w / e - ./modifyFile.sh myInputFile.txt
  4. Вы получите результаты в /tmp/myOutFile.out
0
uTeisT 5 Мар 2015 в 09:18