如何根据已存在的变量来命名文件名?

如何根据已存在的变量来命名文件名?

我用它来删除与模式不匹配的行:

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5"

但现在我需要自动执行此操作,因此我设置一个如下变量:

$ catTMP=~/mpp/*.xml

我想运行这样的东西:

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^__^Here^

我如何根据已存在的变量来设置重定向名称?如果你还是不明白,我的意思是这样的:

$ cd ~/mpp/
$ ls
x.xml 

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2

$ ls
x.xml x.xml.2

或者甚至更好的是就地编辑,但grep不能这样做,所以也许有一种方法可以使用另一个命令来完成此操作,只需执行类似-i.

答案1

就地编辑,仅保留与模式匹配的行:

sed -n -r -i "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml

在 BSD sed(Mac OSX) 上,尝试:

sed -n -E -i '' "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml

基于现有变量的文件名

for fname in ~/mpp/*.xml
do
    egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "$fname.2"
done

上面的方法之所以有效,是因为句点在变量名中是不合法的。因此,shell 知道,在 中$fname.2,变量名称就是fname。如果不是这种情况,则需要花括号。例如:

for fname in ~/mpp/*.xml
do
    egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "${fname}_2"
done

在这里,花括号向 shell 表明变量名是fname,而不是fname_2

答案2

使用awk

for x in `ls ~/map/*.xml`;do awk '/(pattern1|pattern2|pattern3|pattern4|pattern5)/{print}' $x > $x.2; done

for 将循环遍历所有 xml 文件和 awk find 模式,如果匹配将存储在 .xml.2 中

答案3

你可以grep这样使用:

for f in /dir/*glob*
do  grep -E 'pattern|list' <<INFILE >"$f"
$(cat "$f")
INFILE
done

它会删除每个文件中的所有尾随空白行,$f但我的假设是空白行可能不在您的pattern|list范围内。

相关内容