替代空间在文本的一部分

问题描述 投票:0回答:2

我想只有在一个文本的一部分来代替空格。

我输入文字如下,

---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,但没有奏效。

unix awk sed
2个回答
0
投票

可否请您尝试以下(考虑到你的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---

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---
  • qazxsw POI:用一个新行字符替换qazxsw POI其次是非空格字符后发现第一空间(:a;s/(\n[^ ]*) (.*\n)/\1\n\2/
  • \n:一个循环来处理剩余空间。 \n[^ ]*是一个sed测试命令之前替换命令成功时循环到ta标签
© www.soinside.com 2019 - 2024. All rights reserved.