我正在尝试制作一个脚本,它将第一个位置参数 in$foo
并删除 in 行之前的所有$foo
行files.txt
。但是我不断收到以下错误:
sed: -e expression #1, char 22: unknown command: f
. 我的输入是recup_dir.6/f5681240.mpg
,我什至尝试过逃避/
但 recup_dir.6\/f5681240.mpg
没有帮助。我还四处寻找不同的转义文本方法,但没有帮助。我的代码是:
foo=$1;
sed -i "0,/^file $foo$/d" files.txt
编辑:让问题更清楚,说我有一个名为files.txt
file ab/c
file eg/f
file hi/j
file xy/z
现在我想删除特定元素之前的所有元素 say hij
,所以我使用了可以正常工作的命令sed -i '0,/^file hi\/j$/d' files.txt
。
但是,当我尝试将其用作上面显示的脚本的一部分时,它会失败。运行./script.sh eg\/f
失败并出现错误sed: -e expression #1, char 23: unknown command: `f'
谢谢
问题是您的字符串包含斜杠字符。当由 shell 注入到
sed
表达式中时,该字符会产生语法错误(它会提前结束正则表达式)。解决此问题的一种方法是确保每个都像您注入的字符串
/
一样被转义\/
,但这有点尴尬。另一种方法是使用在字符串中找不到的分隔符:请注意,第一次出现的分隔符需要在表达式中进行转义,这
0
通常不是范围的有效开始。如果您还想输出匹配的行:
替代解决方案:
如果变量
output
不为零或空白,则输出每一行。1
每当一行file
后面跟着在命令行上给变量的字符串时,该变量就被设置为file
。如果您还想输出匹配的行: