Замена шаблона с переменной

for i in *.jpg 
  do 
  b=$(echo $i | sed 's/.*dir=//' | sed 's/%2F/\//g' | sed 's/&file=//')
  mkdir -p "$(dirname "$b")
  mv "$i" "$b"
done

Строка с вызовами sed хранит полный путь, который должно получить имя файла.
Строка mkdir создает каталог, включающий промежуточные каталоги, и не жалуется, если они уже существуют.

1
19.02.2015, 02:44
4 ответа
sed -e "/$old/i$new" -e "/$old/{N;N;d}" input > output

Где

  • $ alt может быть просто 28.47969107 или одна первая строка или одна первая строка 28.47969107 0.00000000 0,0000000000
  • $ new Форма 28.47969107 0.00000000 0,00000000 \ N0.00000000 28.47969107 0.00000000 \ N0.00000000 0,000000000000 28.47969107

Другой путь (если у вас есть новый GNU SED (версия> 4.2.1) с вариантом --z Escape Newline Внутри Vaiabiles:

sed -z "s/$(printf "%b" "$old"|sed '$!s/$/\\/')/$(printf "%b" "$new"|sed 's/$/\\/')/" input > output

или если вы делаете замену внутри сценария Назначение функции

end_esc(){ printf "%b" "$@"|sed '$!s/$/\\/' ; }
sed -z "s/$(end_esc $old)/$(end_esc $new)/" input > output
0
28.01.2020, 02:12

. t не откроет новую оболочку для запуска t, поэтому все созданные или измененные переменные останутся после выполнения. t будет искаться в $ PATH, поэтому, если вы хотите выполнить t из пути, где вы сейчас находитесь, команда должна была быть ./t

./t выполнит t, который находится в пути, где мы сейчас создаем оболочку для выполнения.

Уточнить немного больше. Предположим, что t содержит:

#!/bin/bash 
data=hello 

После выполнения ./t вы можете эхо $ data из командной строки и ничего не получите, но если вы запустите ./t и запустите эхо $ data вы получите привет на вашем экране.

-121--29177-

Сбор всех комментариев к ОП:

путем вырезания (набор разделителя полей на " и печати второго поля только из строк, где существует разделитель):

cut -sd\" -f2

по grep jimmij (найдите образец и напечатайте его часть только после \K ):

grep -Po 'anm="\K[^"]*'

по awk jasonwryan (набор разделитель поля к " и печать второго поля):

awk -F\" '{print $2}'

на sed (заменить все строки на обратное соответствие (внутри скобок () ), которые соответствуют всем не « после первого » и печатают строки, где такое замещение выполнено только):

sed -n 's/[^"]*"\([^"]*\).*/\1/p'
-121--14557-
sed -e '$!N;$b' -e "/\n.*\n/!N;s/$old/$new/;t" -e P\;D

Выше будет работать, но вот что: новые строки в $ old должны быть представлены как \n , а новым строкам в $ new должен предшествовать \ обратная косая черта. Новые строки в ваших ценностях - это то, что доставило вам неприятности. Например, после расширения:

sed 's/24.0000000001
.000000000000
.0000000000/...'

... не работает. Это неоконченное регулярное выражение - видите?

Вместо этого:

old='num\nnum\nnum'
new='num\
num\
num'

... это то, что вам нужно.

Если, по какой-либо причине, вам будет трудно самостоятельно избежать вариации, то вы можете сделать что-то вроде:

(  set -f; IFS='
'; printf '%s\\n' / .* '/!N;s/'$old
   printf '%s\\\n' */$new"/;t$IFS#"
)| sed -e '$N;$b' -f - -e P\;D input > output

Но это будет зависеть от отсутствия пустых строк в любой переменной, и это, вероятно, не легче.

0
28.01.2020, 02:12

SED S / «$ OLD» / "$ NEW" / G работает для меня

-1
28.01.2020, 02:12

сначала, давайте определим строку образца для NEW :

$ new=$'1 2 3\n4 5 6\n7 8 9'

Теперь давайте удалим три строки, которые следуют Примитивные векторы решетки и замените их New :

$ awk -v "new=$new" 'f==1{print new} f{f--;next} {print} /primitive/{f=3}' input
scale
 1.000
primitive lattice vectors
1 2 3
4 5 6
7 8 9
grid dimensions
  100 100 100
0
28.01.2020, 02:12

Теги

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