【问题标题】:Regex, find character between two specific words, right before second word正则表达式,在两个特定单词之间查找字符,就在第二个单词之前
【发布时间】:2020-04-17 03:26:50
【问题描述】:

我一直在尝试使用 capture a word between two wordsGet Word Between two underscores 等等,但没有取得多大成功......

我想在“##”之前找到换行符,这个“##”在“## baba”之后,但不是紧随其后,中间有一些文字。文件中有很多“##”,总是以 \n 开头。请参阅下面的架构:

当前输入文件

##

## baba

rosa rosa rosam rosae ipsum


##

##

找到后插入“helloworld”作为脚本的参数

期望的输出

##

## baba {could also be "foo" or "bar"}

rosa rosa rosam rosae ipsum

helloworld


##

##

我使用以下 script.sh 尽可能接近:

awk -i inplace -v foo=$2 -v new=$1'\n\n' '
    f&&/^##/{print new; f=0} {print} /^## baba/{f=1}
' a.md

我想要最后两件事:

  1. 用参数 $2(变量 foo)替换 baba,
  2. 将 \n 包含在 ^## 中,使其位于上一行。

非常感谢您的帮助

【问题讨论】:

  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。
  • 请将预期的输出和您的尝试添加到您的问题中以使其完整。见How to Ask。正则表达式不太可能是正确的解决方案 - Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.。此外 - 当您必须在单个字符串上执行 s/old/new/ 时,sed 是最好的工具,它与涉及多行的任何事情的最佳工具完全不同 - awk 更有可能是候选者。跨度>
  • 可能是 helloworld 或者别的什么,我使用 $1 来使用特定的措辞。然后我想用参数 $2(变量 foo)替换 baba。也请赞成这个问题。我受到了抨击,因为我的问题最初写得不好!如果不是负面的话,这将有助于提高知名度...
  • 这个问题仍然令人惊讶地模糊,我认为因为你仍然试图描述一个正则表达式来解决问题而不是描述实际问题。我尽我所能更新它以尝试清除它,但请检查现在是否说了你想说的话。在看到包含## 的行之后,您似乎想在包含## baba 的第一行之前插入行helloworld 2 个空行,对吗?

标签: regex bash awk markdown


【解决方案1】:

在尝试使用 UNIX 工具时使用 regex101.com 通常会导致更多的混乱,而不是解决问题,因为它支持的 regexp 变体与标准 UNIX 工具的变体不匹配。您还没有发布您的预期输出,所以我猜这就是您想要的:

$ awk -v new='helloworld' 'f&&/^##/{print new; f=0} {print} /^## baba/{f=1}' file
##




## baba



{append or replace with -> helloworld here}
helloworld
##

##

【讨论】:

  • 我也想在上面包含一个 hello world ,但 ^\n## 不起作用
  • 再次 - 在您的问题中包含预期的输出,以免误解您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2016-01-26
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多