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

在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

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元字符的输入将被禁用。