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