![如何根据已存在的变量来命名文件名?](https://linux22.com/image/58648/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E5%B7%B2%E5%AD%98%E5%9C%A8%E7%9A%84%E5%8F%98%E9%87%8F%E6%9D%A5%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%9F.png)
我用它来删除与模式不匹配的行:
$ 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
范围内。