假设我有一个这样的列表:
list='item1.service item2.service item3.target item4.service'
我需要过滤此列表以获得如下内容:
item1 item2 item4
因此,有两点需要注意:
- 我只需要保留
.service
物品。 - 我只需要“基本”名称,不需要后缀
.service
。
还有一个重要信息:我正在 busybox 上运行,其中的工具经常出现故障(例如:我的grep
不支持 Perl 正则表达式)。
我一直在努力尝试sed
和的组合grep
,我能得到的最好的结果是:
$ echo $list | grep -io '[a-z0-9\-\_@]*.service' | sed 's/\.service//'
item1
item2
item4
但它需要对每个输入执行两次基本相同的匹配,这看起来效率不高。有人能提出更好的解决方案吗?
提前致谢。
答案1
list='item1.service item2.service item3.target item4.service'
echo "$list" | sed -r '
# Since the input is only one line, all commands will scan all the pattern space,
# so the commands order matters.
# replace for nothing unwanted text
s/[a-z0-9@_-]+\.target//
# replace for nothing unwanted suffix
# (with 'g' flag the command will replace all occurrences)
s/\.service//g
# squeeze double spaces
s/ +/ /g
# replace space for new line character
s/ /\n/g'
我认为这将适用于所有版本的 BusyBox (如果您的 BusyBox 中有它的话也sed
可以)。awk
我刚刚下载了最新的 BusyBox 版本并运行,make menuconfig
但找不到任何对 Perl 正则表达式的引用。