Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中删除文件中两个位置之间具有特定字符的所有行_Linux_Bash_Shell_Command_Centos7 - Fatal编程技术网

在Linux中删除文件中两个位置之间具有特定字符的所有行

在Linux中删除文件中两个位置之间具有特定字符的所有行,linux,bash,shell,command,centos7,Linux,Bash,Shell,Command,Centos7,我想创建一个脚本文件来执行以下操作: 我将给这个脚本一个文件名,脚本将删除所有在两个位置之间具有特定字符的行,例如:脚本必须删除所有仅在第一个字符和第七个字符之间具有“mz”的行,否则将不执行任何操作 增强此脚本,将单词和位置作为用户输入读取,其中位置应为数字,否则,脚本将停止并显示错误消息 我用过 sed -i '/mz/d' filename 但该命令将删除所有具有mz的线,无论其位置如何。 多谢各位 编辑: Test.txt 大家好,mz你好吗?我希望你做得很好 2-我希望能正确地做这

我想创建一个脚本文件来执行以下操作:

  • 我将给这个脚本一个文件名,脚本将删除所有在两个位置之间具有特定字符的行,例如:脚本必须删除所有仅在第一个字符和第七个字符之间具有“mz”的行,否则将不执行任何操作
  • 增强此脚本,将单词和位置作为用户输入读取,其中位置应为数字,否则,脚本将停止并显示错误消息
  • 我用过

    sed -i '/mz/d' filename 
    
    但该命令将删除所有具有mz的线,无论其位置如何。 多谢各位

    编辑: Test.txt

    大家好,mz你好吗?我希望你做得很好

    2-我希望能正确地做这件事

    嗨,Mz,我希望能一起做这件事

    这是一个有3行的示例txt文件,第一行不会被删除,因为mz位置不在第3和第7位置之间。 第二行将被删除,因为mz位于正确的位置。 第三行也将被删除 注意:我可以使用任何东西,我不是被迫使用sed命令

    awk -v fst=$1 -v trm="$2" -v lst="$3" '{ astr=substr($0,fst,lst);if (match(astr,trm) ) { next } }1' filename
    

    使用awk,将字母计数作为变量cnt set从第一个传递的脚本参数传递。将搜索项设置为从第二个传递参数设置的变量trm。然后使用awk的substr函数创建一个变量astr,该变量表示cnt指定的第一个字符。使用此astr变量并尝试与传递的trm变量匹配。如果匹配,则跳到下一行,否则使用速记1打印。

    mz
    位于前7个位置时,
    mz
    前面最多5个字符

    sed -ir '/^.{0,5}mz/d' file
    

    请将示例输入(无描述、无图像、无链接)和该示例输入的所需输出添加到您的问题中(无注释)。是否必须使用
    sed
    ?我认为仅仅使用一个基本的或扩展的regexp很难做到这一点。我会在read-r行时使用
    循环。使用bash参数展开运算符提取两个位置之间的字符。检查该变量是否匹配通配符
    *mz*
    。参数扩展:
    ${var:startindex:length}
    perl-ne'print,除非substr($,0,7)=~m/mz/'input
    非常感谢您的匹配,但是如何指定第一个和最后一个位置,我的意思是如果我需要第四个和第十个位置之间的搜索项怎么办?。。如果是这样,我需要删除这些行,否则跳过,什么也不做…您可以添加第一个位置作为附加参数。我用新变量fst和lst而不是cnt修改了答案。。