При использовании этой команды это пойдет от текущего пути вниз. Таким образом, у Вас есть что-то вроде этого:
dir1
dir1/temp_diag
dir1/temp_diag/file1
Вы выполняете свою команду изнутри dir1
и найдите, вводит в dir1/temp_diag и выполняется
mv ./temp_diag/file1 temp_diag/file1
Вы на самом деле говорите команде перемещать файл в себя.
ОБНОВЛЕНИЕ: Если у Вас нет subdirs с файлами затем, можно добавить опцию найти maxdepth 1. Так:
find . -type f -name 'diag*' -maxdepth 1 -mtime +30 -exec mv {} temp_diag \;
или если Вы имеете subdirs, но не хотите включать temp_diag затем:
find . -path ./temp_diag -prune -o -print -type f -name 'diag*' -mtime +30 -exec mv {} temp_diag\;
Я не знаю, как вы хотите ввести строку. Это дает желаемый эффект, но может потребоваться изменить его в зависимости от того, как вводится строка:
aa() { echo $3 ; } ; aa "abcd efgh" "ijkl mnop" "qrst uvwxyz"
Изменить: Итак, если он находится в переменной (он должен быть определен в кавычках "):
AA="\"abcd efgh\" \"ijkl mnop\" \"qrst uvwxyz\""
echo $AA
затем:
FIRST=`echo $AA| awk -F \" '{print $2}'`
SECOND=`echo $AA| awk -F \" '{print $4}'`
THIRD=`echo $AA| awk -F \" '{print $6}'`
echo $FIRST : $SECOND : $THIRD
, как указал выше jasonwryan. Вы сказали, что хотите использовать sed, но это делает его ненужным сложным:
FIRST=`echo $AA| sed 's/^\"\([^\"]*\)\".*/\1/'`
SECOND=`echo $AA| sed 's/^\"[^\"]*\" \"\([^\"]*\)\".*/\1/'`
THIRD=`echo $AA| sed 's/^\"[^\"]*\" \"[^\"]*\" \"\([^\"]*\)\".*/\1/'`
Edit2: На самом деле можно полностью достичь без sed, awk, perl, .. только с bash, используя встроенную функцию "read", подобную этой (эхо-сигналы предназначены для отладки):
#!/bin/bash
aa() {
echo '$1'="$1"
IFS=\" read aaa FIRST bbb SECOND ccc THIRD ddd <<< "$1"
echo FIRST=$FIRST : SECOND=$SECOND : THIRD=$THIRD
}
AA="\"abcd efgh\" \"ijkl mnop\" \"qrst uvwxyz\""
echo '$AA'="$AA"
aa "$AA"
Вы сказали это в комментарии:
строка выше находится в переменной. Мне нужно извлечь каждую секцию (первую, вторую, третью) и сохранить в ней разные переменные
Так что давайте просто разделим ее.
IFS=\" #set the shell's field separator
set -f #don't try to glob
set -- $var #split on $IFS
var1=$2 var2=$4 var3=$6 #yay
unset IFS #restore something like a sane default
Это не будет обрабатывать строки, которые могут содержать кавычки с обратной косой чертой. Надеюсь, это не проблема, потому что мне это не нравится.
Основываясь на (и несколько упрощая) ответ ludvik02 sed
:
AA='"abcd efgh" "ijkl mnop" "qrst uvwxyz"'
AA1=$(echo "$AA" | sed -r 's/^([^"]*"){1}([^"]*).*/\2/')
AA2=$(echo "$AA" | sed -r 's/^([^"]*"){3}([^"]*).*/\2/')
AA3=$(echo "$AA" | sed -r 's/^([^"]*"){5}([^"]*).*/\2/')
(Note that this ↑ is different on every line.)
Параметр -r
для sed
включает расширенные регулярные выражения.
Нам это нужно, чтобы использовать { n }
,
что означает n
вхождений предыдущего регулярного выражения.
([^ "] *")
- составное (групповое) регулярное выражение, которое соответствует
любому количеству символов, кроме "
, завершается "
.
Пример входной строки может соответствовать этому регулярному выражению до шести раз
(поскольку он содержит шесть "
символов);
с ...
вставлены, чтобы различать промежутки между строками,
эти вхождения
"abcd efgh" ... "ijkl mnop" ... "qrst uvwxyz"
↑↑--------↑↑----↑↑--------↑↑----↑↑----------↑
1 2 3 4 5 6
совпадают с любым нечетным числом (например, три) вхождений, которое потребляет
все вплоть до n
th
(например, третий) "
символ, то есть символ "
в начале
( ( n +1) / 2)
-я (например, вторая) строка в кавычках.
Тогда ([^ "] *)
соответствует (и группам) все до (но не включая)
( n +1)
-го "
символа,
т.е., символ "
в конце второй строки в кавычках.
Таким образом, эта группа (вторая группа) соответствует второй строке в кавычках.
Наконец, . *
потребляет оставшуюся часть входной строки.
Итак, мы заменяем всю входную строку на \ 2
, значение второй группы:
"abcd efgh" ... "ijkl mnop" ... "qrst uvwxyz"
↑↑--------↑↑----↑⇑=======⇑⇈≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡⇈
1 2 3
↑---------------↑⇑=======⇑⇈≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡⇈
\1 \2 (unnamed)