Regex 有没有办法在bash中的特定子字符串之后提取子字符串?

Regex 有没有办法在bash中的特定子字符串之后提取子字符串?,regex,string,bash,awk,split,Regex,String,Bash,Awk,Split,我每天早上都会从我的一位工程师那里收到一个.txt文件,其中包含以下信息: "New York"|NYC|network-details source-group NYC-srcIP dest-group NYC-destIP "San Francisco"|SF|network-details source-group SF-srcIP dest-group SF-destIP 我们有一个运行的脚本,通过提供指定的源组或目标组,它可以向我们返回类似于以下内容的信息: #Calling on

我每天早上都会从我的一位工程师那里收到一个.txt文件,其中包含以下信息:

"New York"|NYC|network-details source-group NYC-srcIP dest-group NYC-destIP

"San Francisco"|SF|network-details source-group SF-srcIP dest-group SF-destIP
我们有一个运行的脚本,通过提供指定的源组或目标组,它可以向我们返回类似于以下内容的信息:

#Calling on source-group
NYC-srcIP|000.000.000.0/32
SF-srcIP|111.111.111.1/32

#Calling on dest-group yields similar info
NYC-destIP|000.000.000.0/32
SF-destIP|111.111.111.1/32
我面临的主要问题是对大量数据执行此操作,并解析.txt文件中的字符串,这样我就可以运行脚本并将其附加到两个不同的文件中,从而只获取所有这些位置的源组和目标组

但是.txt有多个分隔符。实际上,我只需要源组值(ex:NYC srcIP)和dest组值(ex:NYC destp)


在bash中有没有一种简单的方法可以做到这一点?最好是pythonic,在这里我可以为我的.txt文件中的每一行获取源组和目标组之后的第一个空格分隔的子字符串?

基本剪切/awk应该足够了,如下所示:

cat ex.txt | sed 's/".*"//' | awk '{print $3,$5}'

sed
有助于去除双引号中的第一部分,正如注释中指出的那样,双引号中可能包含空格。

pattern="source-group ([^[:space:]]+) dest-group ([^[:space:]]+)"
while read line; do
    if  [[ $line =~ $pattern ]]; then
        echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}
    fi
done

bash test.sh请为解析的*.txt文件添加所需的输出。
NYC srcIP
NYC destIP
是文字字符串还是仅仅是真实数据的占位符?出现在“类似于下面的信息”中的IP值来自哪里?(即
| 000.000.000.0/32
)。祝你好运。如果城市名称不包含空格(例如:“Dallas”),那么这将不会产生正确的输出。不清楚“纽约”和“旧金山”是否是唯一的输入城市,我只是在观察。您可以先通过
awk
,使用
“|”
作为分隔符,隔离整个输入行的结尾部分,与城市名称中是否存在空格无关(例如:
awk-F\|“{print$3}”
)。@kaan您是对的,我错过了。我将编辑答案,使其更加一致。
pattern="source-group ([^[:space:]]+) dest-group ([^[:space:]]+)"
while read line; do
    if  [[ $line =~ $pattern ]]; then
        echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}
    fi
done