0

以下 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”分隔

4

3 回答 3

2
kent$  echo "1   abc
1   \N
\N  xyz"|awk '{gsub(/\\N/,"0",$2)}1'|column -t
1   abc
1   0
\N  xyz
于 2012-08-01T13:33:09.707 回答
1

您可以在表达式中使用下面的正则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

请注意,确切地\N2nd列被替换。即使有任何数量的列带有\N这个 sed 表达式,也\N只会从2nd列中替换。

于 2012-08-01T13:33:36.993 回答
0

尝试这个:

sed -r 's/^([^\t]+\t)\\N/\10/' nulltest.txt
于 2012-08-01T12:12:55.730 回答