Переименуйте файл HTML на основе содержимого тега

В bash нельзя "преобразовывать аргумент в целое число для выполнения арифметических действий". В bash переменные рассматриваются как целое число или строка в зависимости от контекста.

Чтобы выполнить арифметические действия, следует вызвать оператор арифметического расширения $((...)). Например:

$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3

или, как правило, предпочтительнее:

$ echo "$((a + 1))"
3

Вы должны знать, что bash (в отличие от ksh93, zsh или yash) выполняет только целочисленную арифметику. Если у вас есть числа с плавающей запятой (числа с десятичными дробями), то вам помогут другие инструменты. Например, используйте bc:

$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14

Или вы можете использовать оболочку с поддержкой арифметики с плавающей точкой вместо bash:

zsh> echo $((3.14 + 1))
4.14
0
18.02.2018, 03:20
5 ответов

Si la etiqueta está sola en la línea 8 -, tiene muchas formas de seleccionarla.

tag=$( awk NR==8 file )

tag=$( awk 'NR == 8 { print ;}' file )

donde

  • NRes el número de registro (número de línea)
  • printes una acción implícita

o

tag=$(sed -n 8p file)

donde

  • -nno hará eco de la línea
  • 8pimprime la octava línea.

y muchos otros.

como se indica en el comentario, transmitir el número de línea es arriesgado. Si el archivo es un archivo xml válido, la extracción de la etiqueta sería más fácil y segura.

0
28.01.2020, 02:16

El camino correcto confind+xmlstarletherramientas:

find. -type f -name "*.html" -exec sh -c \
'name=$(xmlstarlet sel -t -v "//tagname" $1 2>/dev/null); 
 [ ! -z "$name" ] && echo mv "$1" "${1%%/*}/${name}.html"' _ {} \;
  • name-variable a la que se le asigna un valor (el contenido de la etiquetatagname)para el nuevo nombre de archivo
  • [ ! -z "$name" ]-compruebe si un nuevo nombre de archivo no está vacío (, es decir, se encontró <tagname>y tenía un valor)
1
28.01.2020, 02:16

Con :

Archivo:

<!DOCTYPE html>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <a>foo</a>
        <b>bar</b>
        <c>base</c>
    </body>
</html>

Comando:

for file in *.html; do
    tag=$(xmllint --xpath '//b/text()' $file)
    echo mv "$file" "${tag}_$file"
done

Comentar:

Desactive el comando echo cuando sus pruebas estén bien para ejecutar el comando de verdad

3
28.01.2020, 02:16

Con estrella xml:

xmlstarlet format --html teste.html | xmlstarlet select --html --template --value-of '//html/body/div/h1'

Salida:

teste

Utilicé xmlstarlet format --html teste.htmlpara corregir su código html no válido.

1
28.01.2020, 02:16

Mi solución final fue el siguiente código, que combina dos sugerencias. ¡Gracias chicos!

for file in *.html; do
    tag=$(xmlstarlet format --html $file | xmlstarlet select --html --template --value-of '//html/body/div/h1')
    mv "$file" "${tag}.html"
done

¡Funcionó muy bien para mis archivos!

0
28.01.2020, 02:16

Теги

Похожие вопросы