gpt4 book ai didi

regex - 如何在Linux中替换多行中的模式

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:53 26 4
gpt4 key购买 nike

假设我有一个名为 text.txt 的文件在text.txt中,我有一些以下模式:

/**
* @something
**/

我想将此模式替换为空字符串。执行此操作最简单的 Linux 命令是什么?

  1. “grep”不起作用,因为这是多行模式。
  2. 我尝试了“sed”,但无法正常工作。
  3. 我想“awk”可能很容易,但是“awk”看起来很复杂,而且我对“awk”不熟悉。

最佳答案

假设我们的输入文件是:

$ cat text.txt
before
/**
* @something
**/
after

我们可以使用awk过滤掉注释:

$ awk '/\/\*\*/ {c=1; next} /\*\*\// {c=0; next} c==0 {print}' text.txt
before
after

awk 的工作原理是使用一个名为 c 的变量作为标志。当我们开始时,c=0 表明我们不在评论中。当出现注释开始行 /** 时,我们设置 c=1c 保持为 1,直到出现下一个注释结束行 **/,在这种情况下,c 将设置回 0。仅当 c=0 时才会打印该行。不打印打开和关闭注释行之间的任何内容,无论格式如何。

该代码看起来很有趣,因为 /* 都是 awk 的事件字符。所以,他们都需要通过反弹来逃脱。因此,例如,查找注释开始行的正则表达式类似于 \/\*\*,而查找注释结束行的正则表达式类似于 \*\*\/

更复杂的输入文件

假设输入文件具有更复杂的结构,如 JS 示例所示:

$ cat file
something
/**
* @something
**/ random
hello
hi /**
* @something
**/ bye
hola
gracias
bye

我们可以使用 awk 处理这个问题,如下所示:

$ awk -v RS='\\*\\*/\n*' '{sub(/\n*\/\*\*.*/,"",$0); print $0}' file
something
random
hello
hi
bye
hola
gracias
bye

以上内容已使用 GNU awk 进行了测试。由于它使用多字符记录分隔符,因此它可能不适用于旧版本的 awk

虽然awk通常逐行读取文件,但在上面的版本中,我们设置了记录分隔符RS来匹配注释的结尾。然后,我们删除从评论开始到记录结尾的所有内容并打印记录。

关于regex - 如何在Linux中替换多行中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22998862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com