以下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”
分隔答案 0 :(得分:2)
kent$ echo "1 abc
1 \N
\N xyz"|awk '{gsub(/\\N/,"0",$2)}1'|column -t
1 abc
1 0
\N xyz
答案 1 :(得分:1)
您可以在sed
表达式中使用以下正则表达式,以确保\N
位于第2列。
^([^\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
和\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
。
答案 2 :(得分:0)
试试这个:
sed -r 's/^([^\t]+\t)\\N/\10/' nulltest.txt