【问题标题】:Multiple sub-string matches using process substitution使用进程替换的多个子字符串匹配
【发布时间】:2019-08-25 22:04:57
【问题描述】:

我想在 .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) )

【问题讨论】:

    标签: bash perl awk sed


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-04
        • 2017-12-06
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        相关资源
        最近更新 更多