以下 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通知的替代部分中,使用\1and\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