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
создает каталог, включающий промежуточные каталоги, и не жалуется, если они уже существуют.
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
. t
не откроет новую оболочку для запуска t, поэтому все созданные или измененные переменные останутся после выполнения. t будет искаться в $ PATH, поэтому, если вы хотите выполнить t из пути, где вы сейчас находитесь, команда должна была быть ./t
./t
выполнит t, который находится в пути, где мы сейчас создаем оболочку для выполнения.
Уточнить немного больше. Предположим, что t содержит:
#!/bin/bash
data=hello
После выполнения ./t
вы можете эхо $ data
из командной строки и ничего не получите, но если вы запустите ./t
и запустите эхо $ data
вы получите привет на вашем экране.
Сбор всех комментариев к ОП:
путем вырезания
(набор разделителя полей на "
и печати второго поля только из строк, где существует разделитель):
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
Но это будет зависеть от отсутствия пустых строк в любой переменной, и это, вероятно, не легче.
сначала, давайте определим строку образца для 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