извлекать строку между двойными кавычками

При использовании этой команды это пойдет от текущего пути вниз. Таким образом, у Вас есть что-то вроде этого:

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\;
3
18.06.2015, 02:01
3 ответа

Я не знаю, как вы хотите ввести строку. Это дает желаемый эффект, но может потребоваться изменить его в зависимости от того, как вводится строка:

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"
2
27.01.2020, 21:16

Вы сказали это в комментарии:

строка выше находится в переменной. Мне нужно извлечь каждую секцию (первую, вторую, третью) и сохранить в ней разные переменные

Так что давайте просто разделим ее.

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

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

2
27.01.2020, 21:16

Основываясь на (и несколько упрощая) ответ 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)
1
27.01.2020, 21:16

Теги

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