regex - sed 命令删除文本,直到为 csv 的每一行找到匹配项

标签 regex linux csv sed data-manipulation

我有一个 csv 文件,我试图从该行的开头删除所有字符,直到它找到第一次出现的“2015”。我想对 csv 文件中的每一行执行此操作。

我的csv文件结构如下:

Field1 , Field2 , Field3 , Field4
sometext1 , 2015-07-15 , sometext2, sometext3
sometext1 , 2015-07-14 , sometext2, sometext3
sometext1 , 2015-07-13 , sometext2, sometext3

我不能对第一次出现的逗号使用 cut 命令或 sed,因为 Field1 中的文本有时也会包含逗号,这使得解析变得复杂。我想如果我为每一行搜索文本 2015 的第一次出现并将前面的所有字符替换为空字符,那么这应该可行。

仅供引用,我只想在 2015 年第一次出现时执行此操作。另一列中有另一个包含 2015 年的文本字段,在此之前的任何文本都不会受到影响。

例如,如果我的原始行是:

sometext1,#015,2015-07-10,sometext2,2015,sometext3

我希望它返回:

2015-07-10,sometext2,2015,sometext3

有人知道执行此操作的 sed 命令吗?

任何帮助将不胜感激!

谢谢

最佳答案

假设“#####”从未出现在一行中,这是使用 sed 的一种方法:

sed -e 's/2015/#####&/'|sed -e 's/.*#####//'

例如:

> echo sometext1,#015,2015-07-10,sometext2,2015,sometext3\
  |sed -e 's/2015/#####&/'|sed -e 's/.*#####//'
2015-07-10,sometext2,2015,sometext3

第一个 sed 命令将“#####”作为 2015 年第一次出现的前缀,第二个 sed 命令删除从“#####”前缀开始到结束的所有内容。

使用这种两阶段方法的基本原因是 sed 的正则表达式匹配器只有总是选择最长匹配的贪婪通配符,不支持选择最短匹配的惰性匹配。

如果“#####”可能出现在一行中,则可以用更不可能的字符串代替它,例如“7z#dNjm_wG8a3!esu@Rhv="。

关于regex - sed 命令删除文本,直到为 csv 的每一行找到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31439661/

相关文章:

java - 从终端运行 java 项目时没有这样的文件

java - 有没有办法将多个参数发送到TestNG中的@Factory注释

regex - 让 Mercurial 忽略除某些子目录之外的所有内容

python - 使用一个文件中的文本在第二个文件中搜索匹配项

c# - 我需要一个正则表达式来验证斯里兰卡车号

python - 无法使用 Python3 格式化来自 Linux 的输出数据

java - 正则表达式匹配单个单词

php - mysql注入(inject)破坏?

python-3.x - 从python3中的csv文件中删除特定列

Powershell - 将日志文件转换为 CSV