sed:-e 表达式 #1,字符 4:未知命令:"\"



我写了一个脚本,从文件夹中获取一个txt文件,我想在文件末尾插入一行空白,然后写入。但我有一个问题,因为控制台返回:sed:-e表达式#1,char 4:未知命令:"。

这是代码:

adb shell "sudo cp /boot/uEnv.txt /home/rock/"
adb shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"
adb shell "sudo sed -i '$i extraargs=rtl8723ds.rtw_initmac="MACAUXTXT"' /home/rock/uEnv.txt"
adb shell "sudo sed -i "s/MACAUXTXT/$(cat /sys/class/net/wlan0/address | sed 's/.{9}//' | sed 's/^/00:e0:4c:/' )/" /home/rock/uEnv.txt"
adb shell "sudo cp /home/rock/uEnv.txt /boot/"
adb shell "sudo cp /home/rock/Service/20-rock.conf /usr/lib/NetworkManager/conf.d/"
adb shell "sudo rm /home/rock/Service/rockpi-backup.sh"
adb shell "sudo rm /home/rock/Service/20-rock.conf"
adb shell "sudo rm /home/rock/uEnv.txt"

这是个问题:在这里输入图像描述

问题在于嵌套引用:

adb shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"

运行adb命令的shell处理其所有参数,包括双引号中的sudo ...部分。由于双引号允许外壳进行变量扩展,因此$s在执行sed甚至sudo之前进行扩展。根据您在名为s的变量中存储的内容,它将被sed替换并最终处理。如果没有s变量,则会替换一个空字符串,$s将消失。

如果你用echo代替adb:,你可以自己看看

echo shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"

shell sudo sed-i'/$/\n/'/home/rock/uEnv.txt

现在sed的中间参数是/$/n/而不是$s/$/n//$/被解释为一个正则表达式过滤器来决定对哪些行进行操作,n/被解释为命令及其参数。由于不是一个有效的命令,您将得到描述的错误。

有几种方法可以做到这一点。

我一时想不出一个好的解决方案,但有一个解决方案是避开最顶部外壳中的美元符号,这样它就可以原封不动地传递到子外壳:

adb shell "sudo sed -i '$s/$/n/' /home/rock/uEnv.txt"

我也很好地避开了第二个美元符号,尽管在你的情况下,它没有效果。它没有被替换,因为/不是一个合法的变量名。但是,如果您后来决定(例如(将sed命令的分隔符更改为#,以处理模式或替换字符串中的文件名,则第二个美元符号可能已经成为一个问题,因为#是参数计数shell变量的名称。

最新更新