gpt4 book ai didi

bash - 使用 awk 格式化文本

转载 作者:行者123 更新时间:2023-11-29 09:18:55 25 4
gpt4 key购买 nike

我很难理解如何使用 awk 实现我想要的结果,并且在搜索了相当长一段时间后,我找不到我正在寻找的解决方案。

我有一个看起来像这样的输入文本:

Some text (possibly containing text within parenthesis).
Some other text
Another line (with something here) with some text
(
Element 4
)
Another line
(
Element 1, span 1 to
Element 5, span 4
)
Another Line

我想正确格式化“(”和“)”之间的怪异行。预期输出如下:

Some text (possibly containing text within parenthesis).
Some other text
Another line (with something here) with some text
(Element 4)
Another line
(Element 1, span 1 to Element 5, span 4)
Another Line

查看堆栈溢出我发现了这个:
How to select lines between two marker patterns which may occur multiple times with awk/sed

所以我现在使用的是 echo $text | awk '/\(/{flag=1;next}/\)/{flag=0}flag'

除了过滤掉不匹配的行,这几乎可以工作,这是最后一个命令产生的输出:

(Element 4)
(Element 1, span 1 to Element 5, span 4)

有人知道怎么做吗?我对任何建议持开放态度,包括如果您了解得更多,就不要使用 awk。

如果您教我如何去除我的问题代码块上的句法着色,将加分 :)

十亿次感谢

编辑: 好的,所以我接受了@EdMorton 的解决方案,因为他提供了一些使用 awk(好吧,GNU awk)的东西。但是,我目前正在使用@aaron 的 sed voodoo 咒语取得巨大成功,并且可能会继续这样做,直到我在该特定用例上遇到任何新问题。

我强烈建议阅读 EdMorton 的解释,最后一段让我很开心。如果路过的人有关于 awk/sed 的好资源可以分享,请随时在评论中分享。

最佳答案

这是我使用 GNU sed 的方式:

s/^\s*(/(/;/^(/{:l N;/)/b e;b l;:e s/\n//g}

对于那些不会说乱码的人来说,这意味着:

  • 从以空格和左括号开头的行中删除前导空格
  • 测试该行现在是否以左括号开头。如果是这种情况,请执行以下操作:
    • 将这个点标记为标签l,表示循环的开始
    • 从输入到模式空间添加一行
    • 测试模式空间中是否有右括号
    • 如果是,跳转到标签e
    • (如果不是)跳转到标签l
    • 将此点标记为标签e,表示代码结束
    • 从模式空间中删除换行符
  • (隐式打印模式空间,是否修改过)

这可能可以改进,但它确实起到了作用:

$ echo """Some text (possibly containing text within parenthesis).
Some other text
Another line (with something here) with some text
(
Element 4
)
Another line
(
Element 1, span 1 to
Element 5, span 4
)
Another Line """ | sed 's/^\s*(/(/;/^(/{:l N;/)/b e;b l;:e s/\n//g}'

Some text (possibly containing text within parenthesis).
Some other text
Another line (with something here) with some text
(Element 4)
Another line
(Element 1, span 1 to Element 5, span 4)
Another Line

编辑:如果你可以禁用历史扩展(set +H),这个 sed 命令会更好:s/^\s*(/(/;/^(/{:l N;/)/!b l;s/\n//g}

关于bash - 使用 awk 格式化文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41186932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com