我需要在 Linux 中的管道分隔文件中的管道 5 之后用空格替换 00

我需要在 Linux 中的管道分隔文件中的管道 5 之后用空格替换 00

我需要00用管道分隔文件中的空格替换,但前提是00出现在第五个管道之后。我正在使用Linux。我试过:{sed 's/00/\ /6' input.txt > output.txt}

样本数据:

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|00
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

我想要以下结果:

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|  
ABC|DE|GGH|00|FFHJ|Y
ABC|DE|GGH|N|FFHK|N
ABC|DE|GGH|OO|FFHU|  

答案1

鉴于您提供的示例,您所需要的只是:

$ sed 's/|00$/|/' file
FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

或者对于 6 个以上字段的输入更加稳健/灵活:

$ awk 'BEGIN{FS=OFS="|"} $6=="00"{$6=""} 1' file
FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

答案2

使用(以前称为 Perl_6)

raku -pe 's:pos($/.from)/ \| 00 /| / if m:5th/ \| /;'  

或者

raku -pe 's:pos($/.from)[ \| 00 ] = "| " if m:5th[ \| ];'  

输入示例:

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|00
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

示例输出:

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT| 
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

Raku 实现了一个:nth“副词”正则表达式参数,它允许您指定您要查找的匹配项(例如:1st, :2nd, )。:nth(5)

上面的 Raku 代码将位置处的匹配m:5th(检测|竖线字符)与替换相结合,开始在匹配变量位置s:pos($/.from)搜索匹配。$/.from

因此,如果您匹配第 5 个|,该位置就会保存在 中$/.from。如果您\| 00在该$/.from位置找到正则表达式,则用空格替换。否则,00字符保持不变,如|第二个数据行上的第三个字符之后所示。

[注意,如果您想保留所有“早期”列不变,而仅替换“后来”列,请使用副词:continue而不是:pos副词]。

https://docs.raku.org/language/regexes#index-entry-matching_adverb_:pos-matching_adverb_:p-Pos
https://raku.org

答案3

sed "s/\(\(.*|\)\{5\}[^0]*\)00/\1 /" <input.txt

含义: \(\(.*|\)\{5\}: 五斜线

[^0]*第五个斜杠后非零

all to \1 打印 \1 和两个零。

输入示例:

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|rZZ00r
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

示例输出:

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6
ABC|DE|GGH|Y|FFHT|rZZ  r
ABC|DE|GGH|00|FFHT|Y
ABC|DE|GGH|N|FFHT|N
ABC|DE|GGH|OO|FFHT|

相关内容