如何使用bash和正则表达式排除单词列表中的单词?

时间:2016-01-26 23:17:17

标签: regex linux bash

使用bash我有类似的东西:

MYLIST='Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp'

实际上,列表可以以不同的顺序包含数百个不同的单词。我只是想保持简单。

如何更改列表以排除以.xy.c

结尾的单词

如果可能的话,我更喜欢使用正则表达式。

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以将Bash模式规则用作类似于正则表达式的语言。特别是,Bash在应用模式时特别优先选择$ @和$ * - 它将它们视为单词的列表,并将模式应用于列表中的每个项目。

因此,您需要编写一个函数(因此您将在$ @或$ *中有一个参数列表),以便您可以在列表上应用该模式。您将使用%%模式,它表示“匹配并删除最长的模式”。这是我的看法:

$ strip_xy_cpp() {
>     RESULT="${*%%*.xy.cpp}"
>     echo "$RESULT"
> }

$ echo $MYLIST
Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp

$ NEWLIST=$( strip_xy_cpp $MYLIST )

$ echo $NEWLIST
Word1.c Word2.c Word3.xy.c Word4.cpp

答案 1 :(得分:1)

我有一个不使用REGEX的解决方案,但它至少是简单的脚本:

我测试了脚本:

str="Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp"
echo $str
for file in $str
do
    if [ ! ${file: -5} == ".xy.c" ]
    then
        echo $file
    fi
done

可以将其更改为接受参数:

for str in $1
do
    if [ ! ${str: -5} == ".xy.c" ]
    then
        echo $str
    fi
done
  • for str in $1部分遍历每个文件(或单词) 由空格隔开。
  • ! ${str: -5} == ".xy.c"部分会检查str字符串的最后五个字符是否等于.xy.c。如果它们相等,那么!会使if语句结果为false。因此,特定的str字符串不会打印echo

然后你可以运行:

$ bash scriptName.sh "Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp"

如果要将输出存储在文件中:

$ bash scriptName.sh "Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp" > result.txt

答案 2 :(得分:1)

help full

作为旁注:

按照惯例,环境变量($ my_list='Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp' $ read -ra my_arr <<< "$my_list" $ result_arr=() $ for i in "${my_arr[@]}"; do [[ $i != *.xy.c ]] && result_arr+=("$i"); done $ printf '%s\n' "${result_arr[@]}" Word1.c Word2.c Word4.cpp Word5.xy.cpp PATHEDITOR,...)和内部shell变量(SHELLBASH_VERSION,.. 。)完全资本化。所有其他变量名称应为小写。以来                 变量名称区分大小写,这种约定避免意外地覆盖环境和内部变量。