2013-01-09 285 views
1

我想用命令行解析一些文本文件。其中一部分涉及重新附加一些格式不正確的電子郵件中的破損字詞。舉例:在Mac OS X的.sh文件中使用sed

9,650 330,765.0 16.38% NYSE (000) 1,707,915 272,099.0 18.95%  Commodit= 
ies Close Change % Change Crude Oil (Feb) 19.62 0.32 1.66% Heating Oil (Ja= 

我想搶'商品'。我正在使用這個workaround來完成工作。

我使用的是Mac OS X 10.7和GNU sed版本4.2.1。如果在命令行我輸入

sed ':a;N;$!ba;s/=\r\n//g' ./filename 

sed正常工作。但是,如果我運行這個bash腳本:

#!/bin/bash 


sed ':a;N;$!ba;s/=\r\n//g' filename 

sed不起作用。然而,同樣的腳本Ubuntu的命令行下工作:

9,650 330,765.0 16.38% NYSE (000) 1,707,915 272,099.0 18.95%  Commodities Close Change % Change Crude Oil (Feb) 19.62 0.32 1.66% Heating Oil (Jan) 

我的Mac上,簡單的腳本

#!/bin/bash 


sed 's/=//g' filename 

成功地刪除所有的等號。我嘗試不同的字符組合來反斜槓,但沒有太大的成功。對Mac終端不喜歡的任何提示?

+0

示例文件在每行的最後一個等號後面包含一個空格。這可能是你的命令失敗的原因嗎?另外,也許嘗試改變你的shebang到'#!/ bin/sh',它可以在OSX上運行。祝你好運。 – Steve

+0

@steve感謝您的建議。不幸的是,將/ bin/bash改爲/ bin/sh不起作用。 :(我更新了示例文件以刪除空格,但它們不在實際文件中。 – RussH

回答

0

這很可能是PATH設置。 /bin/bash使用默認的$PATH;不知道爲什麼,但也許這取決於你的正常工作shell(是那個bash),或者PATH設置在哪個點文件中。

OS X帶有自己的(BSD)sed,它與GNU不一樣,因此不起作用。 在腳本中運行sed命令將獲取BSD sed,而不是您自己安裝的GNU sed。在腳本中使用sed的完整路徑,或者在腳本中設置$ PATH。顯然,你在Ubuntu上沒有問題,因爲默認的sed是GNU。

+0

好吧,我在腳本中放置了'gsed'而不是'sed',這似乎起作用。我必須在MacPorts上安裝它,或者好吧,當我在腳本中放置'echo $ PATH'時,我看到了與在命令行上輸入相同的命令相同的PATH。 – RussH

+1

如果你可以從命令行調用'sed',但不能從腳本調用,並且你的'PATH'是一樣的,也許它是一個在腳本中沒有被識別/擴展的別名? – Evert

+0

謝謝。我再次看了,我有別名sed =' gsed'在我的.bashrc文件中。我嘗試將它移動到我的.bash_profile和.profile文件中,按照http://stackoverflow.com/questions/4477328/bashrc-not-read-when-shell-script-is-invoked-從桌面快捷方式,但我的別名仍然無法在腳本中識別...仍然試圖找出它 – RussH