【问题标题】:Sed edit selection before replace替换前的 Sed 编辑选择
【发布时间】:2016-09-05 03:39:22
【问题描述】:

我需要在执行替换之前编辑一个 sed 选择...一种嵌套查询

这是 file.csv 的前两行

"some text over one line"||02/21/2015 00:00:00||54.34||0.234     
"some text over 
multiple
lines"||02/21/2015 00:00:00||64.24||0.432 

我想从第一列中删除换行符 - 第一个分隔符 || 之前的所有内容@

此命令收集每一列并允许我单独引用它们

sudo sed -i 's/\(.*\)||\(.*\)||\(.*\)||\(.*\)/\1||\2||\3||\4/g' file.csv 

我现在需要在替换之前编辑\1。类似于进一步的 sed 命令 sed -i ':a;N;$!ba;s/\n//g' file.csv - 但仅适用于 \1 而不是整个文件

输出应该是这样的

"some text over one line"||02/21/2015 00:00:00||54.34||0.234
"some text over multiple lines"||02/21/2015 00:00:00||64.24||0.432

【问题讨论】:

  • 一定要sed吗?在awk 做会容易得多。
  • 我可能会想到 perlText::CSVText::ParseWords
  • 不需要sed,我就是这么习惯的。只要可以写回文件,就可以打开任何工作

标签: unix sed


【解决方案1】:

sed 可以做到,但是您必须使用保持空间。 awk 有printf,可以更轻松地控制输出格式:

awk '{printf "%s%s",(/^"/&&NR>1)?RS:"",$0}' file

适用于给定的示例。

附:如果您正在寻找仅限 sed 的解决方案,请发表评论,我将删除答案。

【讨论】:

  • 这似乎有效-您能否快速解释一下如何(所以我知道它是否会概括)?我对 awk 不是很熟悉,但不管用什么都很好。
  • @PeteBurnap 检查 BOL 是否为 ",如果为真,则打印新行,否则不打印。以这种方式加入。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 2016-06-17
  • 2016-04-27
  • 2012-11-02
  • 2014-10-28
  • 2014-02-04
  • 1970-01-01
  • 2014-10-28
相关资源
最近更新 更多