Bash
Bash:重寫在同一行中讀取的文件
我正在開發一個用於在命令行中部分自動化路由器連接的 bash 腳本。這是我遇到問題的部分:
#!/bin/bash STRING2="ESSID" MYPWD=$(pwd) sudo iwlist wlan1 scan | grep $STRING2 | grep -n $STRING2 > $STRING2.txt sed -r -e 's/\s+//g' -e 's/:ESSID//' $MYPWD"/"$STRING2".txt
最後一行打開一個文本文件,然後從文本文件中刪除空格和 :ESSID,即
$MYPWD/$STRING2.txt
. 我想做的也是sed
通過管道將輸出寫入該文件。以前的方法是grep : > $MYPWD"/"$STRING2".txt"
在末端進行管道傳輸,例如:sed -r -e 's/\s+//g' -e 's/:ESSID//' $MYPWD"/"$STRING2".txt | grep : > $MYPWD"/"$STRING2".txt"
但它最終以一個空的
$MYPWD/$STRING2.txt
. 我不確定為什麼會這樣。有任何想法嗎?編輯
如果沒有最後一個管道 grep,文本文件在執行後包含一些類似這樣的文本:
1:___________ESSID:“somessid”
2:_______________ESSID:“somessid”
3:___________ESSID:“somessid”
4:_______ESSID:“somessid”
ps: <__> 代表空白
#!/bin/bash #declaring a string variable STRING="MERHABA DUNYA" STRING2="ESSID" COUNTER="1" MYPWD=$(pwd) echo -e "Later you can check the recent networks around you from : " $MYPWD"/"$STRING2".txt\n" #or MYPWD=${pwd} #-e flag enables \n escape echo -e $STRING2".txt is being updated\n. . .\n" sudo iwlist wlan1 scan | grep $STRING2 | grep -n $STRING2 > $STRING2.txt # | sed -i# #s/ //g $STRING2.txt > $STRING2.txt sed -r -e 's/\s+//g' -e 's/:ESSID//' $MYPWD"/"$STRING2".txt" NUMLINE=$(sudo cat $MYPWD/$STRING2.txt | wc -l) echo -e "\n. . ." echo -e "\nThere are "$NUMLINE " visible networks\n"
當你有這樣的命令時
sed -e ... "datafile" >"datafile"
你最終會得到一個零長度的結果。原因是shell在執行命令之前設置了stdin和stdout 。所以stdout被發送到文件
datafile
,在過程中創建或截斷它,然後才sed -e ... "datafile"
執行。一個常見的解決方案是這樣的
sed -e ... "datafile" >"datafile.tmp" && mv -f "datafile.tmp" "datafile"
某些命令(包括 的版本
sed
)具有就地編輯選項:sed -i.bak -e ... "datafile" sed --in-place=.bak -e ... "datafile"