sed - замените сложные строки в файле с помощью переменных

Это rename-hash сценарий я использую для переименования файлов к их hashsum, сохраняя расширение неизменным. Берет список файлов, которые будут переименованы как параметры. Использовать -n как первый параметр для пробного прогона.

#!/bin/sh

unset DRY
[ "$1" == "-n" ] && { DRY=1; shift; }

for i in $@; do

if [ -f "$i" ]; then

HASHSUM=$(md5sum "$i" | sed 's/\(..........\).*/\1/')
DIR=$(dirname "$i")
BASE=$(basename "$i")
EXT=$(echo "$BASE" | sed -n 's/[^.]*\(\..*\)/\1/p')
TARGET="$DIR"/"$HASHSUM""$EXT"
if [ "$TARGET" != "$DIR/$BASE" ]; then
   if [ -n "$DRY" ]; then
       echo will rename "$i" to "$TARGET"
   else
       mv "$i" "$TARGET"
   fi
fi

fi

done

Пример:

$ rename-hash -n *
will rename test.pdf to ./f604d0d6ad.pdf
will rename images.tar.gz to ./d41d8cd91b.tar.gz
0
25.09.2015, 22:04
2 ответа

Вы испытываете необходимость для выхода из всех символов в OLD_RULE, который может быть интерпретирован как символы волшебства шаблона. Или проще, используйте шаблон для соответствия строке, которой Вы хотите управлять на и затем только, чтобы выполнить минимальную замену, в которой Вы на самом деле нуждаетесь.

Что-то как (непротестированный) sed -i '/, NAME="eth1"/s/eth1/eth0/' /etc/udev/rules.d/70-persistent-net.rules возможно.

1
28.01.2020, 02:53

Что-то, что могло бы иногда работать (и это работает здесь в этом конкретном примере) должно использовать printfзаключение в кавычки способности и sed -r:

old_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"'
new_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"'
printf -v sed_repl 's/%q/%q/g' "$old_rule" "$new_rule"
sed -r -i "$sed_repl" /etc/udev/rules.d/70-persistent-net.rules
0
28.01.2020, 02:53

Теги

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