2013-10-27 127 views
1

使用下面的示例,我試圖用「|」替換「\ n \ nbeer/name:」。字符:Perl換行符替換

beer/name: The Horseman's Ale 
beer/beerId: 33061 
beer/brewerId: 14359 
beer/ABV: 5.20 

beer/name: blah beer 
beer/beerId: 33045 
beer/brewerId: 14678 
beer/ABV: 5.98 

... 

我正在使用以下嘗試執行此操作,但它正在刪除整個文件。

perl -pi -0 -w -e "s,\nbeer/name,|,g" file.txt 

以下是錯誤我得到:

Substitution loop at -e line 1, <> chunk 1. 

如何修改這個代碼工作?

+2

我無法重現你的問題。在我的系統上,該文件被* not *刪除。 –

+0

謝謝。我應該說「文件中的所有內容都被刪除了」。實際的文件仍然存在,它只是沒有內容。 – user2896837

+1

雖然我必須給你同樣的答案。在我的系統中,空行和'beer/name'被替換爲'|',其餘文件內容保持不變。 –

回答

0

這並不回答你的問題,但有助於保留工作文件。

爲了防止文件被「刪除/清除」,你可以添加一個備份文件的後綴爲-i開關。這將保存具有給定擴展名的原始文件。

perlrun

-i [延伸]

指定由<>構造處理的文件是在就地進行編輯。它通過重命名輸入文件,按原始名稱打開輸出文件並選擇該輸出文件作爲print()語句的默認值來完成此操作。擴展,如果提供,用於修改舊文件的名稱進行備份,遵循以下規則: ...

1

我不知道要正確地理解你的需求,但

上的命令行

perl -0pwe "s,\nbeer/name,|,g" <<<"beer/name: The Horseman's Ale"$'\nbeer/beerId: 33061\nbeer/brewerId: 14359\nbeer/ABV: 5.20\n\nbeer/name: blah beer\nbeer/beerId: 33045\nbeer/brewerId: 14678' 

我以這種方式測試了這個。

輸出:

beer/name: The Horseman's Ale 
beer/beerId: 33061 
beer/brewerId: 14359 
beer/ABV: 5.20 
|: blah beer 
beer/beerId: 33045 
beer/brewerId: 14678 

cat更換perl的部分保證測試流程:

cat <<<"beer/name: The Horseman's Ale"$'\nbeer/beerId: 33061\nbeer/brewerId: 14359\nbeer/ABV: 5.20\n\nbeer/name: blah beer\nbeer/beerId: 33045\nbeer/brewerId: 14678' | sed 's/^/ /' 

輸出:

beer/name: The Horseman's Ale 
beer/beerId: 33061 
beer/brewerId: 14359 
beer/ABV: 5.20 

beer/name: blah beer 
beer/beerId: 33045 
beer/brewerId: 14678 

所以,從那裏我可以easely打Ctrl + 一個和使用離開按Ctrl + /或按Ctrl +到達位置來修改你行...

一旦你輸出符合您的需要,你可以簡單的更換您的交換機:

perl -0pwe '...' -i.bak path/filename 

或建立一個perl腳本:

perltidy <<< 's,\nbeer/name,|,g' 

sed '1i#!/usr/local/bin/perl -0pwi.bak\nuse strict;' <(
    perltidy <<< 's,\nbeer/name,|,g') >myscript.pl