使用bash我有类似的东西:
MYLIST='Word1.c Word2.c Word3.xy.c Word4.cpp Word5.xy.cpp'
实际上,列表可以以不同的顺序包含数百个不同的单词。我只是想保持简单。
如何更改列表以排除以.xy.c
如果可能的话,我更喜欢使用正则表达式。
谢谢。
答案 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
,PATH
,EDITOR
,...)和内部shell变量(SHELL
,BASH_VERSION
,.. 。)完全资本化。所有其他变量名称应为小写。以来
变量名称区分大小写,这种约定避免意外地覆盖环境和内部变量。