Bash

如何將文件名基於已經存在的變數?

  • November 2, 2014

我正在使用它來刪除與模式不匹配的行:

$ 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.

就地編輯,只保留與模式匹配的行:

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

引用自:https://unix.stackexchange.com/questions/165474