如何使用 RegEX 替换文本中的一行?

如何使用 RegEX 替换文本中的一行?

我遇到的问题是尝试匹配两组分隔符(上方和下方)

我试图仅匹配下面分隔符的第二部分(粗体)。

在此输入图像描述

这样我就可以将同一天制作的新版本添加到多个文件中。使用perl,所以当我进行替换时我可以得到这样的结果 在此输入图像描述

无论如何根据https://regex101.com/(以及我运行命令时的经验)它选择两组分隔符, 在此输入图像描述

进行上面和下面的替换。 在此输入图像描述

这是我正在使用的正则表达式

(?!V[0-9]{2}.[0-9]{2}.[0-9]{4}.1)(.*=.$)

UNIX 中的命令:

perl -pe 's#(?!V[0-9]{2}.[0-9]{2}.[0-9]{4}.1)(.*=.$)#-* V02.11.2020.1 11/Feb/2020 Author2 Minor Changed Include lms \n -* ================ ============= ==================== =========== ========================================================/#g' path/to/file

有没有办法选择下面的那个?或者问题源于Negative Lookahead? -**************************************************** *********************
编辑
我使用了 bey0nd 选择的命令

3,$s/ -\*  =[=[:space:]]*\// -*  V02.11.2020.1\t  11\/Feb\/2020\t  Author2\t\t   Minor\tChange include 1ms\n\0/1

它对可读性有很大帮助

但我仍然将两个定界符(=符号)替换。我认为正则表达式的环视功能会有帮助

在此输入图像描述

我正在使用 perl 5 和 sed 4.2

至少我让它在 regex101.com 中工作,但在我的版本中不起作用

希望有人觉得它有用

(-\*  =[=[:space:]]*\/)(?!\n.-\*[[:space:]].V[0-9]{2}.[0-9]{2}.[0-9]{4}.1*)

答案1

这是我将使用的 sed 命令:

sed -e '3,$s/ -\*  =[=[:space:]]*\// -*  V02.11.2020.1\t11\/Feb\/2020\tAuthor2\tMinor\tChange include 1ms\n\0/' file

您可能需要摆弄选项卡才能使其适合您的布局。

答案2

我想我已经有了你想要添加到脚本中的内容。我创建了一个名为 testfile.txt 的文件,其中包含以下文本:

-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* ====== ====== ======= ======= ======/

我这样做只是为了让它看起来大致像您的文件,您可以根据您的特定需求进行定制。以下命令(可以进入 shell 脚本)将在第二个分隔符(位于数据部分的末尾)之前插入“inserting new data inserting new data inserting new data”。我明白这就是你想要做的事情。

lines=`grep -nEe "=+" testfile.txt | sed -e s/":.*"//`
lines=`echo $lines`
read line1 line2 <<< $lines
sed -i ${line2}i"-* inserting new data inserting new data inserting new data" testfile.txt

我的最终文件现在是

-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* inserting new data inserting new data inserting new data
-* ====== ====== ======= ======= ======/

这有效地完成了我对您问题的理解。请澄清是否还有其他问题需要解决才能完成。

请注意,我的正则表达式非常简单,只是强制匹配具有所有等号的行,并假设该文件“行为良好”。如果文件内容可能有所不同(即,如果非分隔符行可以包含等号),您可能需要更具体的正则表达式。我认为你的问题暗示你可以自己编写正则表达式,并且需要帮助来获得第二个匹配项。另请注意,我假设您只想要第二场比赛,而且总会有 2 场比赛。

第一个命令存储与变量中的模式匹配的所有行号lines。第二个命令从变量中清除某种错误字符lines(我不确定是什么),以便它以空格分隔。第三个命令将每个匹配的行号存储在其自己的变量中(这里我假设恰好有 2 个匹配项)。第四个在第二个匹配之前插入所需的新数据。

答案3

我认为 Poisson Aerohead 的方法可能是更好的方法。
我只想去掉一些复杂性。

line=`grep -n '^ -\*  =*' testfile.txt | tail -1 |sed -e s/:.*//`
sed -i ${line}i'\ -* inserting new data ' testfile.txt

请注意,这会将数据插入到以“-* ==”开头的最后一行之前,即使只有一行(那么这也是最后一行),如下所示。
如果没有行,它将被插入到每行之前!

相关内容