如何使用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之前只有空格

现在我的问题是:

  • 如何用一些元符号代替99999来表示实际的行号 我尝试了
    sed“50,${/^\s*put/d}”这个_文件
    ,但它不正确

  • sed "50,${/^\s*PUTS/d}" the_file
    
  • 如何用环境变量替换“printf”?我试过了

    设置图案打印F

    sed“5099999{/^\s*$pattern/d}”该_文件

  • 但这是不对的

    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
    在这种情况下是无用的,但无害的。没有需要继承此变量的子进程。