0

我有一个 ~ 分隔的文本文件,其中包含大约 20 个可为空的列。

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

  1. 第 3 列为零 (0)

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

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

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 行完全不变。

4

1 回答 1

1

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

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

如果只是[^~]*~从第一组的末尾删除一个并不能解决它,那可能是因为您的 sed 版本不支持任何一个\d或重复 with {2}(尽管转义大括号可能会解决这个问题)。

这是一个应该在任何地方都可以使用的版本,它将每个替换\d{2}[0-9][0-9](并修复了上面提到的不正确的列问题):

s/\([^~]*~[^~]*~0~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~[^~]*~\)\([0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]~\)\(.*$\)/\1~\3/
于 2013-02-05T23:45:48.310 回答