有条件地删除分隔文件中一行的一部分

时间:2013-02-05 23:23:50

标签: regex sed

我有一个〜分隔的文本文件,大约有20个可以为空的列。

如果满足以下条件,我试图使用SED(来自cygwin)来“清空”第11列中的值...

  1. 第3列是零(0)

  2. 第11列的日期格式为mm / dd / yy(我真的不担心它是否为有效日期)

  3. 这是我正在尝试的......

    s/\([^~]*~[^~]*~0~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~\)\(\d{2}\/\d{2}\/\d{2}~\)\(.*$\)/\1~\3/
    

    以下是文件中的示例:

    Test A~7~1~~~~72742050~~~Z370~10/25/11~~~0~8.58563698~6.40910452~4.59198764~3.18239469~1.72955975~.23345372~-1.30891113~-2.89971394~1~0
    Test B~7~0~~~~72742060~~~Z351~05/15/12~05/14/12~~0~18.88910518~12.69425528~9.96182381~6.76077612~6.76077612~3.86279298~.22449489~-.91021010~0~0
    Test C~7~0~~~~72742060~~~Z352~06/12/12~ABC~~0~20.60845679~17.54889351~15.52912556~12.43279217~12.43279217~10.32033576~9.35296144~8.09245899~0~0
    

    ......这就是我希望得到的回复

    Test A~7~1~~~~72742050~~~Z370~10/25/11~~~0~8.58563698~6.40910452~4.59198764~3.18239469~1.72955975~.23345372~-1.30891113~-2.89971394~1~0
    Test B~7~0~~~~72742060~~~Z351~05/15/12~~~0~18.88910518~12.69425528~9.96182381~6.76077612~6.76077612~3.86279298~.22449489~-.91021010~0~0
    Test C~7~0~~~~72742060~~~Z352~06/12/12~ABC~~0~20.60845679~17.54889351~15.52912556~12.43279217~12.43279217~10.32033576~9.35296144~8.09245899~0~0
    

    但文件第2行完全没有改变。

1 个答案:

答案 0 :(得分:1)

您正在尝试替换第12列而不是11:

\([^~]*~[^~]*~0~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~\)\(\d{2}\/\d{2}\/\d{2}~\)\(.*$\)
    1     2   3   4     5     6     7     8     9    10    11              12

如果只删除第一个组末尾的[^~]*~之一,则无法修复它,可能是因为您的sed版本不支持\d或重复{2} 1}}(虽然转义大括号可能会解决这个问题。)

这是一个应该在任何地方使用的版本,用\d{2}替换每个[0-9][0-9](并修复上面提到的错误列问题):

s/\([^~]*~[^~]*~0~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~\)\([0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]~\)\(.*$\)/\1~\3/