我遇到的问题是尝试匹配两组分隔符(上方和下方)
我试图仅匹配下面分隔符的第二部分(粗体)。
这样我就可以将同一天制作的新版本添加到多个文件中。使用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
请注意,这会将数据插入到以“-* ==”开头的最后一行之前,即使只有一行(那么这也是最后一行),如下所示。
如果没有行,它将被插入到每行之前!