Unix 替换部分文本中的空格

Unix 替换部分文本中的空格,unix,awk,sed,Unix,Awk,Sed,我只想在文本的一部分中替换空格 我的输入文本如下: ——文本的开始---test1 test2 test3 test4----end在这里--- 我想要的输出是 ---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/

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

我的输入文本如下:

——文本的开始---test1 test2 test3 test4----end在这里---

我想要的输出是

---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,但没有成功。

请尝试以下内容(考虑到您的输入文件与所示示例相同)

输出如下

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

使用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/(--text的开头----)(.*)(--end在这里----)/\1\n\2\n\3/
    :使用backreference,在
    --text的开头---
    之后和
    --end在这里---
    之前分别添加一个换行符
  • :a;s/(\n[^]*)(.*\n)/\1\n\2/
    :用新行字符替换
    \n
    后的第一个空格,后跟非空格字符(
    \n[^]*
  • ta
    :处理剩余空间的循环
    t
    是一个sed测试命令,当前面的替换命令成功时,它会循环到
    a
    标签

请为您的样本使用代码标签{}按钮将它们包装在代码标签中,因为您的样本不清楚。但是代码标签仅用于代码,而不用于样本输入?(尽管如此编辑)@ArigatoManga代码标签也有助于样本的视觉突出,避免样本数据被降价处理。。您能否添加另一个输入/输出示例以使您的问题更清楚<代码>---文本的开头---和
---结尾在这里---
对于您的所有输入都是一致的,还是存在其他模式?另外,用
perl
代替
sed
awk
好吗?这是一个很好的解决方案!!我实际上是在尝试这样的解决方案。你能解释一下这部分的模式会起什么作用吗
s/(\n[^]*)(.*\n)
我检查了单独打印\1\2,但不完全了解它是如何选择的。
---start of text---
test1
test2
test3
test4
---end is here---
sed -E "s/(---start of text---)(.*)(---end is here---)/\1\n\2\n\3/;:a;s/(\n[^ ]*) (.*\n)/\1\n\2/;ta;" file