sed编辑特定列和特定行

时间:2012-08-06 17:21:48

标签: sed

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

  1. 在第一行将1更改为0
  2. 所有其他行将+更改为0,将2更改为+,将3更改为+
  3. 可以执行此操作的sed代码是什么?

    例如输入文件有:

    1 abcd efg
    3 abcd 567
    2 abcd 234
    + abcd 123
    

    所需的结果文件:

    0 abcd efg
    + abcd 567
    + abcd 234
    0 abcd 123
    

4 个答案:

答案 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;第二个是23+

这一切都可以通过一个-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.感叹号表示"对除给定行之外的行执行此操作。"