Bash 如何筛选存储在字符串中的有序列表
在bash中是否可以用另一个给定字符串过滤掉字符串的一部分 我有一个固定的主题列表,定义在一个字符串中。顺序很重要,我只想保留作为参数传递的部分Bash 如何筛选存储在字符串中的有序列表,bash,Bash,在bash中是否可以用另一个给定字符串过滤掉字符串的一部分 我有一个固定的主题列表,定义在一个字符串中。顺序很重要,我只想保留作为参数传递的部分 myDefaultList="s,t,a,c,k" #order is important toRetains="k,t,c,u" #provided by the user, order is not enforced retained=filter $myDefaultList $toRetains # code to filter ech
myDefaultList="s,t,a,c,k" #order is important
toRetains="k,t,c,u" #provided by the user, order is not enforced
retained=filter $myDefaultList $toRetains # code to filter
echo $retained # will print t,c,k"
我可以编写一个丑陋的方法来使用IFS、数组和循环,但我想知道是否有一种“聪明”的方法来做到这一点,即使用内置命令
#!/bin/bash
myDefaultList="s,t,a,c,k"
toRetains="s,t,c,u"
IFS=","
for i in $myDefaultList
do
echo $toRetains | grep $i > /dev/null
if [ "$?" -eq "0" ]
then
retained=$retained" "$i
fi
done
echo $retained | sed -e 's/ /,/g' -e 's/,//1'
我已经帮我检查过了。请查收
我已经帮我检查过了。请检查。这里是另一种方法
tolines() { echo $1 | tr ',' '\n'; }
grep -f <(tolines "$toRetains") <(tolines "$myDefaultList") | paste -sd,
像往常一样分配给变量。这里是另一种方法
tolines() { echo $1 | tr ',' '\n'; }
grep -f <(tolines "$toRetains") <(tolines "$myDefaultList") | paste -sd,
像往常一样分配给一个变量。既然您在评论中提到您对sed/awk开放,请与GNU awk一起检查:
$ echo "$a"
s,t,a,c,k
$ echo "$b"
k,t,c,u
$ awk -v RS=",|\n" 'NR==FNR{a[$1];next}$1 in a{printf("%s%s",$1,RT)}' <(echo "$b") <(echo "$a")
t,c,k
$echo“$a”
s、 t,a,c,k
$echo“$b”
k、 t,c,u
$awk-vrs=“,|\n”'NR==FNR{a[$1];next}$1在{printf(“%s%s”,$1,RT)}”中既然您在评论中提到您对sed/awk开放,请与GNU awk一起检查:
$ echo "$a"
s,t,a,c,k
$ echo "$b"
k,t,c,u
$ awk -v RS=",|\n" 'NR==FNR{a[$1];next}$1 in a{printf("%s%s",$1,RT)}' <(echo "$b") <(echo "$a")
t,c,k
$echo“$a”
s、 t,a,c,k
$echo“$b”
k、 t,c,u
$awk-v RS=“,|\n”'NR==FNR{a[$1];next}$1在{printf(“%s%s”,$1,RT)}中如何处理sed?在Bash中这样做似乎是一个错误的选择。它在Python中应该很简单,在Awk中应该相当简单。在两者之间转换当然很容易,所以如果你想公开字符串,你仍然可以在内部使用数组。我经常在bash中看到一行awk或sed,所以我想这是一种常见的做法。sed呢?在bash中这样做似乎不是一个好选择。它在Python中应该很简单,在Awk中应该相当简单。在两者之间转换当然很容易,所以如果你想公开字符串,你仍然可以在内部使用数组。我经常在bash中看到一行awk或sed,所以我想这是一种常见的做法。打印时不带冒号(,
)idk,如果这与OP.@M.Becerra相关,请检查:)此处也缺少引号。请参阅。打印时不带冒号(,
)idk,如果与OP.@M.Becerra相关,请检查:)此处也缺少引号。请参阅。最好更改函数的名称,因为在大多数系统中,split
是一个用于拆分行的现有实用程序。您仍然需要在echo“$1”
中添加引号,否则,包含shell元字符的输入将被禁用。最好更改函数的名称,因为在大多数系统中,split
是一个用于拆分行的现有实用程序。您仍然需要在echo“$1”
中添加引号,否则包含shell元字符的输入将被禁用。