bash 在特定模式前插入一个新行

bash insert a new line before specific pattern

我有一个包含以下内容的 csv 文件:

"user1","track1","player1" "user1","track2","player2" "user2","track1","player1""user2","track2","player2".....

我需要在此模式之前插入一个新行:"user。 其实一开始我用这个命令

用一个新行替换了每个space
awk -v RS=" " '{print}' myfile >output.csv

但后来我发现在我的文件中的某些点,在某些用户之前没有 space,当我将其导入数据库时​​,列的值在这些点被交换了......:|。所以我想知道是否有人知道如何在特定字符集之前插入一个新行来避免这个问题..

谢谢,

使用 GNU sed 你可以试试这个:

sed -r 's/(.)("user)/\n/g' myfile >output.csv

使用BSD/OSX sed(不支持替换字符串中的转义序列\n,使用ANSI C-quoted string字符串),使用:

sed -E $'s/(.)("user)/\1\\n\2/g' myfile >output.csv

# Alternative, with the ANSI C-quoted quoted string spliced in only where needed.
sed -E 's/(.)("user)/\'$'\n''/g' myfile >output.csv

对于严格符合 POSIX 的 sed,使用文字换行符而不是转义序列 \n:

sed 's/\(.\)\("user\)/\
/g' myfile >output.csv

请注意,对于您的示例输入,某些行将有一个尾随 space。

awk

awk  '{gsub(/"user/,"\n\"user"); print}' file

如果文件以 "user

开头,那将有一个前导 CR

如果你想摆脱它,你可以这样做:

awk  '{gsub(/"user/,"\n\"user"); sub(/^\n/,""); print}' file