如何从XML输出中提取ABC格式地址并按行单独展示?
解决方法
方案一:修正grep正则表达式
直接调整Perl正则,精准匹配完整的ABC开头地址:
cat file_name.xml | grep -i pattern1 | grep -Po 'ABC[^,]+?\.com'
解释:
[^,]+?匹配任意非逗号的字符(+?是贪婪匹配的反向,避免过度截取),刚好能捕获每个逗号分隔的ABCxxx.com地址。
方案二:先提取标签内容再拆分
如果需要适配后续可能的格式变化,可以先把<list_of_names>标签内的内容单独提取,再将逗号替换为换行:
cat file_name.xml | grep -i pattern1 | grep -Po '(?<=<list_of_names>).*?(?=</list_of_names>)' | tr ',' '\n'
要是只想保留ABC开头的地址,再加一层过滤即可:
cat file_name.xml | grep -i pattern1 | grep -Po '(?<=<list_of_names>).*?(?=</list_of_names>)' | tr ',' '\n' | grep '^ABC'
你之前命令出错的原因
你用的ABC*com正则存在语法误解:正则里的*是修饰前一个字符的,这里它作用在C上,表示「匹配0个或多个C」,所以只会匹配到ABC,后面的数字和.com都不会被纳入匹配范围,自然只输出ABC。
其他可选工具方案
使用sed:
cat file_name.xml | grep -i pattern1 | sed -E 's/<list_of_names>(.*)<\/list_of_names>/\1/' | tr ',' '\n'
使用awk:
cat file_name.xml | grep -i pattern1 | awk -F '[<>]' '{print $3}' | tr ',' '\n'
内容的提问来源于stack exchange,提问作者Dazzler95
相关产品推荐
相关产品推荐

