Las herramientas de Unix suelen estar orientadas a líneas -y, por lo tanto, no hay forma de aplicar una expresión regular a varias líneas de entrada utilizando la caja de herramientas estándar.
sed
se puede hacer para procesar el archivo de tal manera que pueda detectar las líneas que está buscando, pero hacemos esto estrictamente usando operaciones en líneas individuales:
$ sed -n '/^Text/{N;/^Text\nLine/=;D;}' file
10
Este script sed
busca la cadena Text
al comienzo de una línea. Cuando lo encuentra, agrega la siguiente línea a su búfer con un \n
en -en medio.
Si el búfer ahora coincide con ^Text\nLine
, entonces el número de línea actual se genera usando el comando =
en sed
. El número de línea generado es el de la línea Line
en el archivo.
Tenga en cuenta que, si bien la segunda expresión regular parece coincidir en una nueva línea del archivo, no es así. Coincide con una nueva línea en su búfer interno, que colocamos allí usando el comando N
cuando leemos la siguiente línea del archivo.
Probablemente usaría esto en un bucle si desea aplicarlo a varios archivos:
for name in pattern; do
printf 'Processing %s...\n' "$name"
sed -n '/^Text/{N;/^Text\nLine/=;D;}' "$name"
done
donde pattern
sería un patrón de globbing de nombre de archivo ordinario que coincide con los archivos que le interesan.
Если у вас есть perl переименование Ларри Уолла
rename 's/[.]jpeg[0-9]*/.jpeg/' *.jpeg[0-9]*
если у вас есть только переименование Util -Linux, это не сработает.
Вы можете использовать цикл for в bash
for n in *.jpeg[0-9]*
do mv -i "$n" "${n%%.jpeg[0-9]*}.jpeg"
done
${var%%pattern}
представляет собой расширение стандартного параметра , которое расширяется до значения var
с удалением (самой длинной )замыкающей части, соответствующей pattern
. Итак, если n
— это foo.jpeg123
, ${n%%.jpeg[0-9*}
— это foo
.(foo.jpeg1abc
также приведет к foo
.)
Я бы рекомендовал использовать zsh
's zmv
здесь, чтобы защититься от потенциальных конфликтов (, например, в текущем каталоге )есть файлы file.jpeg1
и file.jpeg2
перед выполнением . ] любое переименовать.
Вzsh
:
autoload zmv # best in ~/.zshrc
zmv -n '(*.jpeg)<->' '$1'
Где<->
(<x-y>
диапазон чисел, совпадающий здесь без границ, )соответствует любой последовательности десятичных цифр, такой же, как [0-9]##
.
(снять -n
для работы всухую -при удовлетворительном состоянии ).
Предположим, что в каждом имени есть только одна .jpeg
подстрока и что вы хотите удалить все после этой подстроки (независимо от того, число это или какая-то другая строка ), используя стандартный цикл оболочки:
for name in *.jpeg*; do
mv -i -- "$name" "${name%.jpeg*}.jpeg"
done
Подстановка параметра ${name%.jpeg*}
удалит .jpeg
и все, что следует за ним, из значения $name
. Затем мы добавляем строку .jpeg
к результату этой подстановки, чтобы создать новое имя файла.
Бит mv -i --
вызовет mv
таким образом, что будет запрашиваться подтверждение перед перезаписью существующего имени. --
предназначен для защиты следующего имени файла от случайного распознавания как набора параметров, если имя начинается с тире (--
, что означает конец параметров командной строки ).