2017-08-15 48 views
1

我有最難的時間試圖找出如何編寫sed腳本;特別是與標籤和分支。Sed腳本分支問題

例如,我想刪除文本文件中的所有換行符(\n)。如果我在命令行上執行此操作,請執行以下操作:

sed -e ':a;N;$!ba;/s/\n/ /g' testfile.txt 

確實如我所料;所有的換行符都被刪除。

這個問題是在,如果我把命令到一個腳本文件(scrub.sed)這樣:

:a 
N 
$!b a 
s|\n| |g 

sed -f scrub.sed testfile.txt 

我收到以下錯誤,執行:

sed: 3: scrub.sed: whitespace after branch 
sed: 5: scrub.sed: undefined label 'a ' 

我想要遵循所描述的語法here

:top 
command1 
command2 
/pattern/b top 
command3 

我在FreeBSD中使用nano編輯文件,在分支之後我找不到任何「空白」。我究竟做錯了什麼?

+1

即使在強制POSIX模式下,你的腳本在GNU'sed'上也能正常工作。甚至當我在標籤後添加更多空格時。我建議你用十六進制打印腳本(使用'hd'或'od'),並檢查該標籤後面是否有空格,包括'\ r'等。另外,你可以嘗試添加分號,例如':a;'和'$!ba;'。 – randomir

+1

@randomir - 感謝您的建議。我最初嘗試添加分號後無效。 'hd'顯示了一些空格,沒有'\ r',但我不知道它來自哪裏。我能夠解決它。 – Allan

回答

0

問題是nano,這是我用來創建文件的編輯器。

當我在vi中重新創建文件時,問題就消失了;腳本運行沒有問題。

nano,我啓用空格的顯示(P),得到了以下內容:

:a 
N. 
$!ba. 
s|\n|.|g 

(週期是其中所述空格是)

一旦予除去空格, 有效。我試圖創建另一個文件,注意不要在行之間添加任何空格,但由於某種原因,nano將它們添加進去了。我不知道nano爲什麼nano表現出這種行爲,但至少有一個答案向前邁進。