【问题标题】:Backreferencing in awkawk 中的反向引用
【发布时间】:2013-10-18 16:38:12
【问题描述】:

我有一个文本文件,其中包含类似的行

![](screeshot-3.jpg)
The above screenshot shows how you can delete posts by tags.

![](screeshot-4.jpg)
The above screenshot shows how you can delete posts by custom taxonomies.

我想将这些行替换为(注意行号是从上一行的文件名中检索的)

3. The above screenshot shows how you can delete posts by tags.

4. The above screenshot shows how you can delete posts by custom taxonomies.

不应编辑其他行。

我可以写一个正则表达式来匹配这个数字,但是我不确定在替换时如何再次引用这个数字。

请让我知道如何在 awk 中进行操作。

更新:请注意,我不能使用 GNU 版本,它需要同时在 Mac 和 Ubuntu 中运行。

【问题讨论】:

  • 您是否受限于使用 awk?
  • @devnull 不幸的是,是的,因为这是更大的 awk 脚本的一部分。

标签: regex awk


【解决方案1】:

使用 GNU awk 扩展 match():

gawk '
    match($0, /^!\[\].*-([0-9]+)\.jpg/, m) {
        printf "%d. ", m[1]
        next
    }
    1
' file.txt

【讨论】:

  • 很遗憾,我无法使用 GNU awk :(
【解决方案2】:

一种方法是用字符.-分割前一行,并提取第二个位置,保存在变量中并用于每一行非空白:

awk '
    $0 ~ /^!\[\]/ { 
        split($0, arr, /[-.]/)
        num = arr[2]
        next 
    } 
    num {
        print num ". " $0
        num = 0
        next
    } 
    { print }
' infile

它产生:

3. The above screenshot shows how you can delete posts by tags.

4. The above screenshot shows how you can delete posts by custom taxonomies.

编辑:抱歉。我没有读到您不能使用GNU 版本。我评论了[^[:blank:]] 不支持的模式\S。我希望它现在可以工作。

【讨论】:

  • 这会删除![](screeshot-4.jpg) 行,但不会添加行号。
  • 感谢它现在有效。一个快速的问题。在第一个条件中使用$1 和在第二个条件中使用$0 的任何具体原因?我们可以在这两种情况下都使用$0,对吗?
  • @Sudar:是的。在这种情况下也是如此。
  • 感谢您的回答。我发现了另一个问题,但能够根据您的代码修复它。如果在最后一行之后还有更多行,那么所有这些行也将被替换为行号。我已经编辑了你的答案来解决这个问题。
  • @Sudar:啊,好的。您只想替换下一个并为此使用标志。感谢您的修复。
【解决方案3】:

如果你对 perl 没问题,那么你可以使用以下版本:

perl -lne 'if(/^\!.*-([\d]+)\.jpg/)
           {$a=$1}
           elsif(/^[a-zA-Z]/)
           {print "$a \. $_"}' your_file

【讨论】:

  • 谢谢。但不幸的是,我现在仅限于awk
猜你喜欢
  • 2020-02-17
  • 2022-01-21
  • 2012-04-16
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2014-01-12
相关资源
最近更新 更多