我知道的正则表达式是正确的,不适用于awk。请告知



在@dawg回答了我关于如何根据已知模式删除文件中的多个部分的问题后,我想在awk中使用正则表达式来标识我要删除的部分的开头。我正在使用的文件是一个xml文件。事实上,它是包含Linux Mint中最近使用的文件名列表(RUFL(的文件(~/.local/share/最近使用的.xbel(。这就是RUFL的结构:

<?xml version="1.0" encoding="UTF-8"?>
<xbel version="1.0"
xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
>
<bookmark href="file:///home/ocor61/Documents/Linux/Linux%20Mint%20Cinnamon%20Keyboard%20Shortcuts.pdf" added="2021-07-18T01:57:02Z" modified="2021-07-18T01:57:02Z" visited="1969-12-31T23:59:59Z">
<info>
<metadata owner="http://freedesktop.org">
<mime:mime-type type="application/pdf"/>
<bookmark:applications>
<bookmark:application name="Document Viewer" exec="&apos;xreader %u&apos;" modified="2021-07-18T01:57:02Z" count="1"/>
</bookmark:applications>
</metadata>
</info>
</bookmark>
<bookmark href="file:///home/ocor61/Documents/Linux/Linux%20Command%20Line%20Cheat%20Sheet.pdf" added="2021-07-18T01:57:09Z" modified="2021-07-18T01:57:09Z" visited="1969-12-31T23:59:59Z">
<info>
<metadata owner="http://freedesktop.org">
<mime:mime-type type="application/pdf"/>
<bookmark:applications>
<bookmark:application name="Document Viewer" exec="&apos;xreader %u&apos;" modified="2021-07-18T01:57:09Z" count="1"/>
</bookmark:applications>
</metadata>
</info>
</bookmark>
<bookmark href="file:///home/ocor61/Documents/work.bfproject" added="2021-07-20T10:52:59Z" modified="2021-07-22T08:41:57Z" visited="1969-12-31T23:59:59Z">
<info>
<metadata owner="http://freedesktop.org">
<mime:mime-type type="application/x-bluefish-project"/>
<bookmark:applications>
<bookmark:application name="bluefish" exec="&apos;bluefish %u&apos;" modified="2021-07-22T08:41:57Z" count="2"/>
</bookmark:applications>
</metadata>
</info>
</bookmark>
</xbel>

我正在编写一个从列表中删除文件名的脚本。它工作得很好,但我也在处理一个包含不应该使用的模式的数组。例如:如果模式[bookmark]将用于标识必须删除的部分,那么整个文件将变得不可用。这适用于[bookmark]的部分内容,但也适用于href、added、info。。。你明白我的意思。

因此,我想使用正则表达式来解决输入无法使用的模式的问题。

目前,这是我现在使用的awk代码(感谢@dawg(:

ENDLINE='</bookmark>'    
awk -v f=1 -v st="$1" -v end="$ENDLINE" '
match($0, st) {f=0}
f
match($0, end){f=1}' ~/.local/share/recently-used.xbel

$1将是用户在命令行输入的模式,这是必须从RUFL中删除的文件名的一部分。

以下是我想使用的代码,包括不起作用的regexp:

STARTLINE='/(<bookmark href)(.*)($1)(.*)(>)/'
ENDLINE='</bookmark>'
awk -v f=1 -v st="$STARTLINE" -v end="$ENDLINE" '
match($0, st) {f=0}
f
match($0, end){f=1}' ~/.local/share/recently-used.xbel

我在测试了正则表达式https://regexr.com/,所以我知道这是正确的。然而,当我在脚本中使用它时,我得到的错误消息是:

./ruffle.sh: line 99: syntax error near unexpected token `$0,'
./ruffle.sh: line 99: `      match($0, st) {f=0}'

我还尝试在awk命令行中输入regexp本身,而不是变量,但结果相同。

我不知道该怎么办,所以我们非常感谢您的帮助。

我的问题的答案在于正则表达式在不同的环境中使用时会有什么不同。我用来检查regexp的网站适用于JS等语言,但不适用于Bash或其他可能的shell实现。使用shellcheck.net,并在awk命令之前将命令"set-vx"放在脚本中,我成功地解决了问题。

我犯的另一个错误是试图在regexp中捕获完整的一行,而我只需要该行中可以容纳输入的模式的部分(即文件~/.local/share/最近使用的.xbel中"file:"one_answers"added"之间的部分(

现在,使用变量STARTLINE最终对我有效的正则表达式是:

STARTLINE='file:.*'$1'.*added='

我将不得不研究使用xml解析器,谢谢你的建议!然而,就目前而言,我的剧本是有效的。感谢@Sundeep和@EdMorton!

相关内容

  • 没有找到相关文章

最新更新