在 sed 命令中正确转义 /

在 sed 命令中正确转义 /

我正在尝试制作一个脚本,该脚本将采用第一个位置参数并删除中该行$foo之前的所有行。但是我不断收到以下错误: 。我的输入是,我什至尝试过逃避,但没有帮助。我还四处寻找转义文本的不同方法,但没有帮助。我的代码是:$foofiles.txtsed: -e expression #1, char 22: unknown command: frecup_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'

谢谢

答案1

问题是您的字符串包含斜杠字符。当 shell 将其注入到sed表达式中时,该字符会产生语法错误(它会提前结束正则表达式)。

解决此问题的一种方法是确保每个/字符都像\/您注入的字符串一样进行转义,但这有点尴尬。另一种方法是使用字符串中未找到的分隔符:

foo=$1
sed -i "1,\:^file $foo$:d" files.txt

请注意,第一次出现的分隔符需要在表达式中进行转义,并且这0通常不是范围的有效开始。

如果你还想输出匹配行:

foo=$1
sed -i "1,\:^file $foo$: { \:^file $foo$: p; d; }" files.txt

替代解决方案:

awk -v file="$foo" 'output; $0 == "file " file { output = 1 }' files.txt

output如果变量不为零或空白,则输出每一行。1每当一行后面file跟有在命令行上给定变量的字符串时,该变量就被设置为file

如果你还想输出匹配行:

awk -v file="$foo" '$0 == "file " file { output = 1 }; output' files.txt

相关内容