我有一个文件,其中每行的第一个字符是格式控制字符,我需要按如下方式编辑格式控制字符:
- 在第一行更改
1
为0
- 所有其他行 更改
+
为0
、和2
到+
3
+
是什么sed
可以做到这
例如输入文件有:
1 abcd efg
3 abcd 567
2 abcd 234
+ abcd 123
所需的结果文件:
0 abcd efg
+ abcd 567
+ abcd 234
0 abcd 123
我有一个文件,其中每行的第一个字符是格式控制字符,我需要按如下方式编辑格式控制字符:
1
为0
+
为0
、和2
到+
3
+
是什么sed
可以做到这
例如输入文件有:
1 abcd efg
3 abcd 567
2 abcd 234
+ abcd 123
所需的结果文件:
0 abcd efg
+ abcd 567
+ abcd 234
0 abcd 123
这是:
sed '1{y/1/0/;b}; y/+23/0++/'
或者
sed '1y/1/0/; 1!y/+23/0++/'
如果您只想要每行的第一个字符,则需要这样做:
sed '1/^1/s::0: ; 1!{ /^[+]/s::0:; /^2/s::+:; /^3/s::+:; }'
这应该做你想要的。
sed -e '1s/^1/0/' -e '1!s/^+/0/' -e '1!s/^[23]/+/'
第一部分处理第一行,下一部分更改 +,最后一部分处理 2 和 3。感叹号表示“对给定行以外的行执行此操作”。
术语“控制字符”通常表示“0x00 和 0x1F 之间的字符代码”,有时扩展到包括 0x7F,有时扩展到 0x80 到 0x9F。但是,在上下文中,我怀疑您的意思是(在审查中)该列的第一个字符需要更改。在这种情况下,这个经过轻微修改的脚本应该可以解决问题;修订版添加了^
以将匹配项锚定到每行的第一个字符。
sed -e '1s/^1/0/' -e '2,${s/^+/0/;s/^[23]/+/;}' "$@"
第一个-e
选项仅在第一行将 1 更改为 0。
第二个-e
处理其他行。第一个替换处理+
to 0
; 第二个用2
or 3
to +
。
这一切都可以用一个单一的-e
(或没有明确的-e
)来完成,但讨论更容易写。
乔纳森的解决方案本质上是正确的,但是应用多个命令分隔;
是不可移植的。(特别是,OS X 上的 BSD sed 不承认这一点。)为了可移植性,最好把它写成:
sed -e '1s/^1/0/' -e '1!s/^+/0/' -e '1!s/^[23]/+/'
或者
sed -e '1s/^1/0/' -e '1!{
s/^+/0/
s/^[23]/+/
}'