我有一个看起来像
的文件3 5 t27s60
4 8 s30s40
2 2 t80t10
6 4 s80t10
我想制作像
这样的文件3 5 t27 s60
4 8 s30 s40
2 2 t80 t10
6 4 s80 t10
所以我将字段分隔符指定为s或t,但我想将这些字符保留在输出中。
答案 0 :(得分:2)
AFAIK当FS
被设置为常规表达时,无法获得确切的字段分隔符。
我会将sed
用于此用例:
sed 's/...$/ &/' file
s
命令将结尾...
之前的行$
中的最后3个字符替换为空格&
。
如果由于分隔符后面的字符数没有修复,从末尾计算字符不起作用,则可以使用以下sed
命令:
sed -r 's/(s|t)([^st]+)$/ \1\2/' file
我正在使用s
搜索t
或(s|t)
,后跟一个或多个字符,直到它们都不是s
或t
。
答案 1 :(得分:2)
快速awk单行:
awk '{gsub(/[st]/," &",$0)}1' input.txt
输出:
3 5 t27 s60
4 8 s30 s40
2 2 t80 t10
6 4 s80 t10
在这里,我们在&
命令中使用gsub
的特殊含义:它代表机器表达式。因此,gsub(/[st]/," &",$0)
在每个" s"之前添加一个空白。或" t"
如果重复空白是个问题:
awk '{gsub(/[st]/," &",$0);gsub(/[ ]+/," ",$0)}1' input.txt
给出:
3 5 t27 s60
4 8 s30 s40
2 2 t80 t10
6 4 s80 t10
答案 2 :(得分:1)
或perl,如果前一个字符不是空格,则在“s”或“t”之前添加一个空格:
perl -pe 's/(?<=\S)([st])/ $1/g' file
等效的awk是
awk '{print gensub(/([^[:blank:]])([st])/, "\\\1 \\\2", "g")}' file