【问题标题】:replace spaces in part of a text替换部分文本中的空格
【发布时间】:2019-06-28 21:55:16
【问题描述】:

我只想替换部分文本中的空格。

我的输入文字如下,

---start of text---test1 test2 test3 test4---end is here---

我想要的输出是,

---start of text--- 
test1
test2
test3
test4
---end is here---

我试过下面的命令,

sed 's/start of text/start~of~text/; s/end is here/end~is~here/; s/text---/text--- /; s/---end/ ---end/' test_file | tr ' ' '\n' | sed 's/~/ /g'

这可行,但为此我必须硬编码文本行的开头和结尾。有什么办法可以避免这种情况,我尝试在 awk 中使用 gsub,但没有奏效。

【问题讨论】:

  • 请使用代码标签为您的样本{} 按钮将它们包装在代码标签中,因为您的样本不清楚。
  • 但代码标签仅用于代码正确,不适用于示例输入? (但已编辑)
  • @ArigatoManga 代码标签也有助于示例,使其在视觉上脱颖而出并避免示例数据受到降价处理。您能否添加另一个示例输入/输出以使您的问题更清晰? ---start of text------end is here--- 对于您的所有输入都是一致的,还是有其他模式?另外,perl 可以代替sedawk 吗?

标签: unix awk sed


【解决方案1】:

使用 GNU sed,您可以在开始文本之后和结束文本之前添加换行符,然后在文本之间循环使用 t 命令以用换行符替换空格:

sed -E "s/(---start of text---)(.*)(---end is here---)/\1\n\2\n\3/;:a;s/(\n[^ ]*) (.*\n)/\1\n\2/;ta;" file

说明:

  • s/(---start of text---)(.*)(---end is here---)/\1\n\2\n\3/:使用反向引用,在---start of text--- 之后添加一个换行符,在---end is here--- 之前添加一个换行符
  • :a;s/(\n[^ ]*) (.*\n)/\1\n\2/:用换行符替换\n 之后的第一个空格,后跟非空格字符(\n[^ ]*
  • ta:处理剩余空间的循环。 t 是一个 sed 测试命令,当前面的替换命令成功时循环到 a 标签

【讨论】:

  • 一个很好的解决方案!我实际上是在尝试这样的解决方案。你能解释一下这部分模式会做什么吗? s/(\n[^ ]*) (.*\n)我单独检查了打印 \1 \2 但不完全了解它是如何选择的。
【解决方案2】:

您能否尝试以下操作(考虑到您的 Input_file 与显示的示例相同)。

awk 'BEGIN{FS=OFS="---"} {gsub(" ",ORS,$3);print OFS $2 OFS ORS $3 ORS OFS $(NF-1) OFS}'  Input_file

awk 'BEGIN{FS=OFS="---"} {gsub(" ",ORS,$3);print OFS $2,ORS $3 ORS,$(NF-1) OFS}' Input_file

输出如下。

---start of text---
test1
test2
test3
test4
---end is here---

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2021-10-05
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多