コマンドラインでルータ接続を部分的に自動化するための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"
答え1
このような命令があるとき
sed -e ... "datafile" >"datafile"
長さ0の結果が発生します。その理由はシェルが設定されているからです。標準入力そして標準出力コマンドを実行する前に。だから標準出力ファイルに転送して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"