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
我有一个包含以下内容的 csv 文件:
"user1","track1","player1" "user1","track2","player2" "user2","track1","player1""user2","track2","player2".....
我需要在此模式之前插入一个新行:"user
。
其实一开始我用这个命令
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
如果你想摆脱它,你可以这样做:
awk '{gsub(/"user/,"\n\"user"); sub(/^\n/,""); print}' file