1

我有一个文件,其中每行的第一个字符是格式控制字符,我需要按如下方式编辑格式控制字符:

  1. 在第一行更改10
  2. 所有其他行 更改+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
4

4 回答 4

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::+:; }'
于 2012-08-06T18:06:24.490 回答
1

这应该做你想要的。

sed -e '1s/^1/0/' -e '1!s/^+/0/' -e '1!s/^[23]/+/'

第一部分处理第一行,下一部分更改 +,最后一部分处理 2 和 3。感叹号表示“对给定行以外的行执行此操作”。

于 2012-08-06T17:40:47.293 回答
1

术语“控制字符”通常表示“0x00 和 0x1F 之间的字符代码”,有时扩展到包括 0x7F,有时扩展到 0x80 到 0x9F。但是,在上下文中,我怀疑您的意思是(在审查中)该列的第一个字符需要更改。在这种情况下,这个经过轻微修改的脚本应该可以解决问题;修订版添加了^以将匹配项锚定到每行的第一个字符。

sed -e '1s/^1/0/' -e '2,${s/^+/0/;s/^[23]/+/;}' "$@"

第一个-e选项仅在第一行将 1 更改为 0。

第二个-e处理其他行。第一个替换处理+to 0; 第二个用2or 3to +

这一切都可以用一个单一的-e(或没有明确的-e)来完成,但讨论更容易写。

于 2012-08-06T17:27:12.847 回答
1

乔纳森的解决方案本质上是正确的,但是应用多个命令分隔;是不可移植的。(特别是,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]/+/
}'
于 2012-08-06T17:37:31.960 回答