如何使用sed删除具有特定图案和特定线条范围的线条?
这是为我工作的命令:如何使用sed删除具有特定图案和特定线条范围的线条?,sed,Sed,这是为我工作的命令: sed "50,99999{/^\s*printf/d}" the_file 因此,该命令删除50到99999之间所有包含“printf”的行,并且该行printf之前只有空格 现在我的问题是: 如何用一些元符号代替99999来表示实际的行号 我尝试了sed“50,${/^\s*put/d}”这个_文件,但它不正确 sed "50,${/^\s*PUTS/d}" the_file 如何用环境变量替换“printf”?我试过了 设置图案打印F sed“
sed "50,99999{/^\s*printf/d}" the_file
因此,该命令删除50到99999之间所有包含“printf”的行,并且该行printf之前只有空格
现在我的问题是:
sed“50,${/^\s*put/d}”这个_文件,但它不正确
sed "50,${/^\s*PUTS/d}" the_file
sed "50,${/^\s*PUTS/d}" the_file
这行行不通,因为您使用了双引号,需要转义美元:\$
或使用单引号:'50,${/../d}文件
sed "50,99999{/^\s*$pattern/d}" file
这条线应该行得通
编辑
等等,我刚刚注意到您通过set
设置了环境变量。。。如果您使用的是Bash,则这是不正确的。您应该在脚本中使用export PAT=“PUT”
检查@Jonathan和@tripleee的评论假设一个像Bourne一样的shell,比如
bash
:
只需定义shell变量并将它们拼接到sed
命令字符串中:
endLine=99999
pattern='printf'
sed'50'“$endLine”{/^\s*”“$pattern”'/d;}”将_文件
请注意,sed
命令字符串的静态部分是单引号,因为这样可以防止shell对它们进行解释(例如,这意味着您不需要引用$
和`
)
您可以将所有内容都放在一个双引号字符串中,以便能够直接嵌入变量引用,但是区分shell将预先解释的内容和sed将解释的内容很快就会混淆
也就是说,对手头的案例使用双引号字符串很简单:
sed“50,$endLine{/^\s*$pattern/d;}”文件
在Bash或任何POSIX ish shell中,设置模式printf
将$1
设置为模式
并将$2
设置为printf
。您应该使用pattern=printf
。在C shell衍生工具中,您的符号应该有效。set
对于t?csh是正确的,但考虑到它不起作用,您可能正确地假设OP使用的是与Bourne兼容的shell,如Bash。此外,export
在这种情况下是无用的,但无害的。没有需要继承此变量的子进程。