簡體   English   中英

sed命令刪除文本,直到找到csv的每一行都匹配

[英]sed command to delete text until match is found for each line of a csv

我有一個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 =“。

要使用不帶Perl樣式非貪婪運算符的sed來執行此操作,您需要使用Tris所描述的標記您知道的第一個實例。 但是,該解決方案需要了解文件中不會包含的內容。 幸運的是,您可以保證換行符不會出現在行中,因為這是終止行的原因。 因此,您可以執行以下操作:

sed 's/2015/\n&/;s/.*\n//' input.txt > output.txt

注意:這不會修改您必須特別對待的標題行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM