以下 sed 命令按预期工作。我需要做的是仅在第二列中将 null (\n) 更改为 0。
# cat nulltest.txt
1 abc
1 \N
\N xyz
# sed 's/\\N/0/' nulltest.txt
1 abc
1 0
0 xyz
预期成绩 :
1 abc
1 0
\N xyz
数据由制表符“\t”分隔
kent$ echo "1 abc
1 \N
\N xyz"|awk '{gsub(/\\N/,"0",$2)}1'|column -t
1 abc
1 0
\N xyz
您可以在表达式中使用下面的正则sed
表达式,以确保它\N
位于第二列。
^([^\t]+\t)\\N(\t)
所以你的sed
表达将如下所示
sed -r -i 's/^([^\t]+\t)\\N(\t)/\10\2/g' nulltest.txt
解释:
^([^\t]+\t)
: 将匹配正1
则表达式\t
及其()
周围使其成为第一组。
\\N
: 会匹配\N
(\t)
: 它tab
是第二组之后的第二列。
在sed
通知的替代部分中,使用\1
and\2
代表正则表达式中的第一组和第二组,在您的情况下分别是1 followed by \t
和\t
。因此它将保留第一组和第二组,并将其余匹配的字符串替换为0
.
在我的测试中,我使用了下面的输入文件
abcdefgh
3 abc \N \N \N
123 \N \N \N
\N \Nxyz
我得到的输出是
abcdefgh
3 abc \N \N \N
123adsa 0 \N \N
\N \Nxyz
请注意,确切地\N
从2nd
列被替换。即使有任何数量的列带有\N
这个 sed 表达式,也\N
只会从2nd
列中替换。
尝试这个:
sed -r 's/^([^\t]+\t)\\N/\10/' nulltest.txt