Совпадение нескольких вложенных строк с использованием подстановки процесса

#bash #perl #awk #sed

#bash #perl #awk #sed

Вопрос:

Я хочу выполнить сопоставление вложенных строк внутри.файл sh и извлеките список cmds и добавьте к нему существующий файл.

Пока я использую perl -ne , и он работает с последним сопоставленным значением, отображаемым на экране как

 echo 'declare -a org_val=($(chkconfig --list autofs) $(grep "^PROMPT="/etc/sysconfig/init)' |
    perl -pe 's|.*$((.*?))s |1|g'
  

Ниже приведен результат приведенной выше команды:

 grep `"^PROMPT=" /etc/sysconfig/init`
  

Я также хочу, чтобы он выводил

 chkconfig --list autofs
  

Что я сделал, так это написал небольшое .преобразуйте и сохраните результаты sed в массив, используя подстановку команд ниже

 #!/bin/bash
nl='n'
declare -a array0
while IFS=$nl read  -r line
do
array0 =$line
#echo $line
done < <( perl -pe 's|.*$((.*?))s |1|g')  < /tmp/sunny
echo "${array0[@]}"
  

Вывод выше является

 declare -a org_val=($(chkconfig --list autofs) $(grep "^PROMPT=" /etc/sysconfig/init)
  

содержимое /tmp/sunny является

 declare -a org_val=($(chkconfig --list autofs) $(grep "^PROMPT=" /etc/sysconfig/init) )
  

Ответ №1:

 perl -nle'print for /$(([^)]*))/g'
  

Конечно, это предполагает, что внутри ) не существует $(...) .

Ответ №2:

С GNU awk для RS с несколькими символами:

 $ echo 'declare -a org_val=($(chkconfig --list autofs) $(grep "^PROMPT="/etc/sysconfig/init)' |
awk -v RS='[$][(][^()] ' 'RT{print substr(RT,3)}'
chkconfig --list autofs
grep "^PROMPT="/etc/sysconfig/init