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"

答え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"

関連情報