sed的一個問題 - Linux

Table of Contents

我手邊有一個Archlinux pacman安裝清單如下 :

----------------------------------------------------------------
#install.txt

atom #(see: C1. Configure Atom editor)
code #(see: C4. Configure vscode that like atom editor)
wget
p7zip
networkmanager
network-manager-applet #(attach to GUI setting)
gnome-nettool #(GUI network manager)
chromium
rsync
# (rsync is a good tool for backup on the local and the remote,
# It can implement copy and exclude some files or directories:
----------------------------------------------------------------

我要使用sed正規劃處理把#註解清除

查了一下sed的用法 寫個shell如下 :

----------------------------------------------------------------
#install.sh

pacman_cmd="pacman -S "
install_cmd=$(sed -e "s/#.*//" -e "s/^/${pacman_cmd}/" $1)
echo -e "\e[1;32m${install_cmd}\e[0m"
----------------------------------------------------------------

最後echo那段是顯示sed之後結果

執行的指令為 :

----------------------------------------------------------------
sh install.sh install.txt
----------------------------------------------------------------

期望的輸出如下 :

----------------------------------------------------------------
pacman -S atom
pacman -S code
pacman -S wget
pacman -S p7zip
pacman -S networkmanager
pacman -S network-manager-applet
pacman -S gnome-nettool
pacman -S chromium
pacman -S rsync
----------------------------------------------------------------

但實際的結果如下 :

----------------------------------------------------------------
pacman -S atom
pacman -S code
pacman -S wget
pacman -S p7zip
pacman -S networkmanager
pacman -S network-manager-applet
pacman -S gnome-nettool
pacman -S chromium
pacman -S rsync
pacman -S
pacman -S
----------------------------------------------------------------

多了2個空的pacman -S

我知道是最後兩行的#沒被消掉

但是sed應該有把它消掉呀QQ

其他都正確

到這邊就不會處理了orz

還請板上高手幫忙 謝謝!

--
我老婆-子瑜,不服出來灣阿
https://imgur.com/sCghzuF
https://imgur.com/JvAE0Qu
https://imgur.com/k9PCODr
https://imgur.com/CZmFmeq
https://imgur.com/S7FgYgF

--

All Comments

Caroline avatarCaroline2018-10-24
你把該行清空了,但行首 ^ 還是存在,還是取代成功
Connor avatarConnor2018-10-29
所以要把行首^取代為空白 多做這個步驟?
我還在想這個要怎麼寫orz
Charlotte avatarCharlotte2018-10-31
sed -e "s/#.*//" -e "/^$/d" -e "s/^/${...}/"
Hedwig avatarHedwig2018-11-01
sed -e "/^#/d" -e "s/#.*//" -e "s/^/${...}/"
Charlie avatarCharlie2018-11-02
還有, 其實有正規表示式版 (RegExp)
Andy avatarAndy2018-11-03
一是刪掉 #.* 後刪除空白行; 二是先把 # 開頭的行刪掉
Kumar avatarKumar2018-11-03
不過這類用途應該只會用一兩次, 其實沒必要寫成script
Heather avatarHeather2018-11-04
隨便 grep / awk 兜一兜就好了. (預期套件名沒有空白)
Frederic avatarFrederic2018-11-09
cat txt |egrep -v "^#|^$" |awk '{print "ooxx "$1}'
Hedda avatarHedda2018-11-14
另外, 空白行 ^$ 可以考慮改用 ^\s*$
Bennie avatarBennie2018-11-17
${...} = ${pacman_cmd}, 太長推文擺不下 @@