【问题标题】:Delete data between two parameters excluding the parameters in PERL删除两个参数之间的数据,不包括 PERL 中的参数
【发布时间】:2018-02-22 04:03:59
【问题描述】:

我想删除 ) 和 ; 这两个参数之间的所有数据,不包括仅第一次出现

的参数

目前正在删除,包括参数。

猫输入.txt

) delete; 
Test 
Test
)delete;

 

perl -0777 -pe 's/\Q)\E.*?\Q;\E//' input.txt

当前输出:

Test 
Test
)delete;

预期输出:

) ; 
Test 
Test
)delete;

如何排除参数? 有什么帮助吗?

也感谢 awk 中的任何新解决方案。

【问题讨论】:

  • 不应该在预期的输出中最后删除delete这个词吗?因为你说排除第一次出现
  • 提示:\)\Q)\E 清晰得多。如果还不够清楚,请使用/x 并在您的模式中添加空格。

标签: regex perl awk scripting gawk


【解决方案1】:

使用 GNU awk

$ cat infile
) delete; 
Test 
Test
)delete;

$ awk '!f{print f=gensub(/(\)).*(;)/,"\\1 \\2","a");next}1' infile
) ; 
Test 
Test
)delete;

【讨论】:

    【解决方案2】:

    只需指定要使用的替代品:

    perl -0777 -pe 's/\Q)\E.*?\Q;\E/);/' 
    

    's/\).*?;/);/' 可能更具可读性。

    您也可以使用环视:

    's/(?<=\)).*?(?=;)//'
    

    即前面是),后面是;,但它们不属于匹配的子字符串。

    【讨论】:

    • s/(?&lt;=\)).*?(?=;)// 通过切换到s/\)\K.*?(?=;)// 得到了改进,s/\)\K[^\n;]*(?=;)// 更好,因为它避免了非贪婪修饰符用于优化以外的目的。
    【解决方案3】:
    awk '{sub(/. delete./,") ;")}1' file
    
    ) ; 
    Test 
    Test
    )delete;
    

    【讨论】:

      【解决方案4】:

      如果您只想删除 ) 和 ; 之间第一次出现的字符串(通过查看您的预期输出)然后以下内容可能对您有所帮助。

      awk '!n{n=sub(/^\).*\;/,") ;")} 1'   Input_file
      

      输出如下。

      ) ;
      Test
      Test
      )delete;
      

      解释:所以在这里检查变量 n 的值是否为 NULL,在对 ).*; 进行单次替换之前它会为 null。因此,一旦它通过了该条件,它就会使用 awk 的 sub 关键字将所有内容从 ) 替换为 ;使用 ); 并保存它的响应,现在将是 1,因为已经进行了 1 次替换,所以下次这个条件(!n)将永远不会为真,因此它将仅替换第一次出现的 ).*;。 1 表示它将打印 Input_file 的行。

      【讨论】:

      • 谁能告诉我在这里投反对票的原因?
      • 现在完成了,实际上因为没有使用代码标签,不清楚是否需要空间,所以我没有把它放在那里,如果你可以删除 -ve 请告诉我现在。
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多