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"

您最终将得到零长度结果。原因是shell设置了标准输入标准输出在执行命令之前。所以标准输出被发送到文件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"

相关内容