我有一个文件,其中每行的第一个字符是格式控制字符,我需要编辑格式控制字符,如下所示:
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
答案 0 :(得分:2)
这是:
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::+:; }'
答案 1 :(得分:1)
术语“控制字符”通常表示“0x00和0x1F之间的字符代码”,有时会扩展为包含0x7F,有时甚至是0x80到0x9F。但是,在上下文中,我怀疑您(在审核时)是否需要更改列的第一个字符。在这种情况下,这个温和修改的脚本应该可以解决问题;修订版添加^
以将匹配项锚定到每一行的第一个字符。
sed -e '1s/^1/0/' -e '2,${s/^+/0/;s/^[23]/+/;}' "$@"
第一个-e
选项仅在第一行更改1到0.
第二个-e
处理其他行。第一个替代品涉及+
到0
;第二个是2
或3
到+
。
这一切都可以通过一个-e
(或没有明确的-e
)来完成,但讨论会更容易。
答案 2 :(得分:1)
Jonathan的解决方案基本上是正确的,但是应用由;
分隔的多个命令是不可移植的。 (特别是,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]/+/
}'
答案 3 :(得分:1)
这应该做你想要的。
sed -e '1s/^1/0/' -e '1!s/^+/0/' -e '1!s/^[23]/+/'
第一部分处理第一行,下一部分处理+,最后一部分处理2和3.感叹号表示"对除给定行之外的行执行此操作。"