我正在编写一个 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"