2012-08-06 63 views
1

我有一個文件,其中每行的第一個字符是一個格式控制字符和我需要如下編輯格式控制字符:SED編輯特定的列和特定行

  1. 在第一行變化10
  2. 所有其他行更改+02+,並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×00和0x1F的之間的字符代碼」,有時擴展到包括0x7F,有時是0x80至0x9F。但是,在上下文中,我懷疑你的意思是(在審覈中)該列的第一個字符需要更改。在這種情況下,這個適度修改的腳本應該可以解決這個問題。該修訂添加了^以將匹配定位到每行的第一個字符。

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

第一個-e選項僅在第一行上將1更改爲0。

第二個-e處理其他線路。第一個替代品涉及+0;第二種爲23+

它可以用一個-e(或沒有明確的-e)完成,但討論更容易。

+0

注意'2 ''在示例輸出中不會更改爲'+' – choroba 2012-08-06 17:29:13

1

喬納森的解決方案基本上是正確的,但應用多個由;分隔的命令是不可移植的。 (特別是BSD的sed在OS X不承認。)對於便攜性的緣故,它可能會更好,把它寫爲:

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

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

一般來說,我同意在Mac OS X版本的'sed'中存在一些怪癖。但是,我的代碼swer在我的Mac OS X 10.7.4上使用'/ usr/bin/sed'正常工作。 – 2012-08-06 17:45:18

1

這應該做你想要什麼。

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

第一部分處理的第一線,下一個改變了+,最後一個處理2和3的感嘆號表示「這樣做對大於給定一個其他線路。「

+0

+1首先以'^錨定「模式。 – 2012-08-06 17:43:33

+0

感謝所有人,choroba的最後一個在Linux上運行良好! – user1579878 2012-08-30 17:53:27

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::+:; }' 
+0

需要注意'y',因爲問題示例輸出不會用'+'替換所有出現的'2'。沒有'g'標誌的's'是必要的。 – 2012-08-06 18:27:47

+0

雅 - 我沒有看到他想要只替換第一個字符。在這種情況下,的確必須將y替換爲/^+/s :: 0:;/^ 2/s :: +:;/^ 3/s :: +:; – alinsoar 2012-08-06 18:46:44