使用流程替换进行多个子字符串匹配

时间:2019-04-04 08:17:54

标签: 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

我所做的是在下面使用命令替换将一个小的.sh写入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) )

2 个答案:

答案 0 :(得分:1)

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

当然,这假定)中不存在$(...)

答案 1 :(得分:0)

使用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