Bash
如何將文件名基於已經存在的變數?
我正在使用它來刪除與模式不匹配的行:
$ 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
。