如何匹配模式并仅替换模式的一部分?

如何匹配模式并仅替换模式的一部分?

我的文件中有以下单行长行:

#cat file
5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0, 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0, 5FaJmwwoBABC0-frsf9xucw==|...

我想用新行替换逗号字符,因此输出如下所示:

 5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042
 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|
 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
 5FaJmwwoBABC0-frsf9xucw==|...

更具体地说,逗号位于“5”字符之前,请注意“5”字符之前始终有一个空格。

我可以简单地使用以下命令替换逗号:

#cat file | sed -e $'s/,/\\\n/g'

然而,这还不够好,因为逗号有时也可能位于其他尴尬的位置,如下所示:

#cat file
5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==...

我更喜欢使用 sed 但其他解决方案也很棒。我已经在互联网上搜索了四个小时,但找不到针对我的确切问题的解决方案。

答案1

sed方法:

cat file
5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042, 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0, 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0, 5FaJmwwoBABC0-frsf9xucw==|...

sed 's/, \(\S*==\)/\n\1/g' file

输出:

5LkoVZg0BABCBkD9OieAflA==|list1 , |true|0|0|0|172661|1.16|186042
5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0
5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
5FaJmwwoBABC0-frsf9xucw==|...

\S*==- 后跟 的非空白字符序列==,被视为每行的前导序列

答案2

更简单的解决方案tr如下:

cat file | tr "," "\n"

将在哪里tr查找逗号,并用新行替换它\n

输出:

5LkoVZg0BABCBkD9OieAflA==|list1|true|0|0|0|172661|1.16|186042
 5o0QEZg0BABCA3j9OieAflA==|list2|false|0|0|0|0|0|0
 5F3NnwwoBABC1Dfrsf9xucw==|list3|false|0|0|0|0|0|0
 5FaJmwwoBABC0-frsf9xucw==|...

请注意,逗号之前的空格被保留。

相关内容