2016-12-31 47 views
0

我在某個位置有幾十個bash腳本(/subdirectory1),文件中的路徑名不正確(pathname1)。我想以某種方式替換該路徑名爲pathname2,該子目錄中的所有bash腳本*.sh如何在多個文件上執行字符串替換?

有沒有一個標準的方法來做到這一點?

在Perl中,如果我用一個單一的文件file1的工作,我會執行:

perl -pi -e 's/pathname1/pathname2/g' file1 

一個將如何做到這一點的所有文件,*.sh

它不一定在perl中,但這是想到的一種方法。我懷疑還有一種方法可以用其他shell腳本和其他語言來做到這一點---我會很樂意編輯這個問題來縮小選項的範圍。

+1

將'file1'更改爲'* .sh'?你的問題真的不清楚。 –

+1

當然'perl -pi -e's/path1/path2/g'* .sh'將會訣竅 –

+0

@WilliamPursell工作正常嗎? ...我是個白癡 – ShanZhengYang

回答

2

您可以先運行find列出的文件,然後在它們上面運行perlsed或什麼:

find . -name '*.sh' -exec <perl_command> {} \; 

注意{} \;,這意味着運行此爲每個find輸出。

+0

你應該用''來表示你的意思(我假設'-name「* .sh」',但我認爲''是非常明顯的)。 –

+0

我認爲這是一種正交的問題,但肯定。固定。 – yelsayed

+0

我正在考慮另一個註釋,比如''file_pattern>''可能是'-name「* .sh」'或'-type'f'或某種組合來表示它的一般用法。但是,它也是內聯的。 –

3

只是列出所有的文件名,並且它們通過在那裏|用於分隔符所以/路徑不需要進行轉義線

perl -pi -e 's|pathname1|pathname2|g' *.sh 

所有加工線。

這假定*.sh指定您需要的文件。


我們可以看到,這是通過運行

perl -MO=Deparse -ne '' file1 file2 

其輸出

LINE: while (defined($_ = <ARGV>)) { 
    '???'; 
} 
-e syntax OK 

這相當於代碼的一行程序,通過-MO=Deparse禮貌所示的情況下。它告訴我們,環路設置了輸入,這是由<ARGV>提供。

那麼,什麼是<ARGV>這裏?從I/O Operators in perlop

的空文件句柄<>是特殊的:...從<>輸入是無論是從標準輸入,或在命令行上列出的每個文件。

其中

<>只是爲<ARGV>

所以輸入將是從所有提交的文件中的所有行的代名詞。

相關問題