Bash

Bash:重寫在同一行中讀取的文件

  • August 21, 2018

我正在開發一個用於在命令行中部分自動化路由器連接的 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 &gt; $STRING2.txt # | sed -i# #s/ //g $STRING2.txt &gt; $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" &gt;"datafile"

你最終會得到一個零長度的結果。原因是shell在執行命令之前設置了stdinstdout 。所以stdout被發送到文件datafile,在過程中創建或截斷它,然後才sed -e ... "datafile"執行。

一個常見的解決方案是這樣的

sed -e ... "datafile" &gt;"datafile.tmp" && mv -f "datafile.tmp" "datafile"

某些命令(包括 的版本sed)具有就地編輯選項:

sed -i.bak -e ... "datafile"
sed --in-place=.bak -e ... "datafile"

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