我需要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|