【问题标题】:bash insert a new line before specific patternbash 在特定模式之前插入新行
【发布时间】:2016-06-16 01:12:36
【问题描述】:

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

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

我需要在此模式之前插入一个新行:"user。 实际上一开始我用这个命令用新行替换了每个空格

awk -v RS=" " '{print}' myfile >output.csv

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

谢谢,

【问题讨论】:

  • 整个文件只有一行吗?
  • @dawg: 是的,1 行很长

标签: string macos bash newline


【解决方案1】:

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

sed -r 's/(.)("user)/\1\n\2/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)/\1\'$'\n''\2/g' myfile >output.csv

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

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

请注意,在您的示例输入中,某些行将有一个尾随空格。

【讨论】:

  • 感谢您的回复。第一个插入 n 而不是新行:|
  • 这意味着你需要使用第二种命令形式;你在 OSX 上吗?
  • 是的,.. 我应该分两步使用第二种形式吗?
  • 查看我的更新 - 我添加了一个适用于 OSX 的单行表单;最后一种形式也可以按原样工作 - 它只需要跨越 2 行。
  • 在 OS X 上你也可以sed -E 's/(\"user[0-9]+\")/\'$'\n\\1/g'
【解决方案2】:

awk

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

如果文件以 "user 开头,则其中将有一个前导 CR

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

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

【讨论】:

  • 感谢您的回复。你的回答也对我有用..对不起,我不能接受两个答案:|
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2016-01-21
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多