用新行替换第二个空格 sed

3

我有以下格式的数据:

1234 2 3457 2 23454 12 98769 1 123 20

我正在尝试以以下格式获取数据:

1234 2 
3457 2 
23454 12 
98769 1 
123 20 

我尝试使用:

sed -E -e 's/[[:blank:]]+/\n /2' test.txt

但是这并没有起作用。

问题在于你的方法没有起作用,因为你只替换了第二个匹配项。 - fedorqui
4个回答

6

只需使用 shell内置命令:

$ printf '%d %d\n' 1234 2 3457 2 23454 12 98769 1 123 20

或者使用(感谢fedorqui):
$ echo "1234 2 3457 2 23454 12 98769 1 123 20" |
    sed -E 's/([0-9]+\s[0-9]+)\s/\1\n/g'

$ echo '1234 2 3457 2 23454 12 98769 1 123 20' |
    grep -oE '[0-9]+\s[0-9]+'

或者使用(感谢Glenn Jackman):

$ echo "1234 2 3457 2 23454 12 98769 1 123 20" |
    tr -s '[:blank:]' '\n' |
    paste -d" " - -

或者使用

$ echo '1234 2 3457 2 23454 12 98769 1 123 20' |
    perl -lne 'print for /(\d+\s+\d+)+/g'

输出:

1234 2
3457 2
23454 12
98769 1
123 20

注意:

如果您使用了标签,我们可以使用bashism来去除一个管道符|

command <<< 'foo bar base'

这是一个“here-string”。类似于here文档:在<<<后面的单词和换行符会被传递给一个命令的标准输入。语法:command <<< "some sentence"(类似于echo "some sentence" | command,但没有子shell的开销)。
$ time printf '%d %d\n' 1234 2 3457 2 23454 12 98769 1 123 20

real    0m0,000s
user    0m0,000s
sys     0m0,000s

1
使用sed命令将数字与空格分隔的文本转换为每行一个数字对,命令示例:sed -r 's/[0-9]+\s[0-9]+ /&\n/g' <<< "bla" - fedorqui
1
请只返回翻译后的文本:或者 tr -s '[:blank:]' '\n' <<<"$ data" | paste -d" " - - - glenn jackman
1
使用 grepgrep -oE '[0-9]+\s[0-9]+'。也就是说,只打印出 "数字 空格 数字" 的匹配项。 - fedorqui

3

Awk 解决方案:

awk '{ for(i=1; i<=NF; i+=2) print $i, $(i+1) }' test.txt
  • i+=2 - 增量步长(每次迭代处理两个项目)

输出结果:

1234 2
3457 2
23454 12
98769 1
123 20

2
以下 xargs 解决方案可能会对您有所帮助。
xargs -n2 < Input_file

输出结果如下。
1234 2
3457 2
23454 12
98769 1
123 20

2
这可能适用于你(GNU sed):
sed 's/\s/\n/2;P;D' file

将第二个空格替换为换行符。打印出换行符及其之前的内容,然后删除已打印的内容。重复此过程直到模式空间为空,然后用下一行重新填充模式空间并重复上述操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接