2014-10-10 76 views
0

我嘗試了所有的形式,將一個變量傳遞給Perl正則表達式,沒有幸運。這裏有什麼問題?在正則表達式中傳遞變量(bash)

FILENAME=test 
perl -0pe 's|encoding="windows-1250".\?\>|encoding="utf-8" ?>\n <!-- ${FILENAME} -->\n|g' file_unprocessed.xml > file_processed_final.xml 

我也試過$FILENAME\Q$FILENAME\E,但沒有任何幫助。只有一個錯字嗎?

+2

試試這個'perl -pe's | encoding =「windows-1250」。\?\> | encoding =「utf-8」?> \ n <! - '$ FILENAME' - > \ n | g'file_unprocessed.xml> file_processed_final.xml' – chilemagic 2014-10-10 21:47:12

+0

缺少撇號!謝謝! – Adrian 2014-10-10 21:52:18

回答

1

我會用一個更簡單的例子來指導你。假設您想打印單詞test

我們可以做到這一點與此一行代碼:

perl -e'print "test"' 

現在假設我們有存儲在一個變量,$FILENAME字符串test。我們可以打印與

print "$FILENAME" 

但我們必須先設置:

perl -e'$FILENAME="test"; print "$FILENAME"' 

但如果這個變量被設置在bash?你正確地做了這個部分。

FILENAME=test 

讓我們試着在Perl打印此:

perl -e'print "$FILENAME"' # prints nothing 

如果變量是單引號內,然後Perl是解釋它。如果我們把它放在單引號之外,那麼它將在bash中被解釋並且程序將被傳遞給perl解釋器。

perl -e'print "'$FILENAME'"' # prints test 
# open_^  ^ open__^^
# close________^ close___^ 

我喜歡把它作爲封閉單引號,以獲得bash的解釋變量,並再次打開它們去回perl的。

這使我絆倒了以前。你可以在這裏讀到它:Why is '$_' the same as $ARGV in a Perl one-liner?


你可以閱讀有關\Q...\Ehere

您可能仍然需要它,例如,如果您的變量中有?。 Quotemeta將轉義特殊字符來匹配它們的文字字符,而不是使用它們的特殊含義。