Busybox 过滤字符串列表

Busybox 过滤字符串列表

假设我有一个这样的列表:

list='item1.service item2.service item3.target item4.service'

我需要过滤此列表以获得如下内容:

item1 item2 item4

因此,有两点需要注意:

  1. 我只需要保留.service物品。
  2. 我只需要“基本”名称,不需要后缀.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 正则表达式的引用。

相关内容