2012-08-02 52 views
0

我想使用一行Perl命令來更改Bash變量中的數據。我認爲問題在於Perl一行代碼沒有收到數據管道。通過Perl更改Bash變量

我知道bash的變化而變化 即findString=${findString//\//\\/}

我很好奇讓Perl來工作過。我不知道Perl,所以保持簡單。

要清楚,這兩行不起作用: 我希望將文本中的選項卡更改爲\ t。我希望任何Unix行結束被改爲\ n。

findString=$(cat "${findString}" | perl -0777pe 's/\t/\\t/g') 

findString=$(cat "${findString}" | perl -0777pe 's/\n/\\n/g') 

這裏是我的bash代碼:

#!/bin/bash 

#The idea here is to change tab to \n 
# and line End to \n 

# debug info 
export PS4='+(${BASH_SOURCE}:${LINENO}):' 

# trace all the lines 
#set -o xtrace 
echo "---------------------- start ----------------------------------------" 



# string to change. 
# chops off the last \n 

read -d '' findString <<"EOFEOFEOF" 
# Usage: /Users/mac/Sites/bithoist/commandLine/BitHoist/BitHoist-PPC-MacOS-X [options] input... <input> output 
       # Options and inputs may be intermixed 
    -stdin  # Use standard input as input file 
    -offset nn # Offset next input file data by nn 

EOFEOFEOF 

findString=$(cat "${findString}" | perl -0777pe 's/\t/\\t/g') 

findString=$(cat "${findString}" | perl -0777pe 's/\n/\\n/g') 

echo "------------> findString of length ${#findString} is:" 
echo -E "${findString}" 
echo 
+4

你想在這些命令中使用'echo',而不是'cat'。 – chepner 2012-08-02 17:55:09

+0

謝謝你的觀察,chepner。我需要回聲。 – historystamp 2012-08-03 18:11:57

回答

2

它應該工作。

下面是如何

$ echo Helloabtb | perl -0777pe 's/a/x/g' 
Helloxbtb 
$ myvar=`echo Helloabtb | perl -0777pe 's/a/x/g'` 
$ echo $myvar 
Helloxbtb 

所以,如果它與echo工作應該與cat工作。我建議在我的例子中使用反引號,並嘗試。類似於

findString=`cat $findString | perl -0777pe 's/\t/\\t/g'` 

也很有可能,cat需要一個文件。所以你的情況echo可能適合作爲

findString=`echo $findString | perl -0777pe 's/\t/\\t/g'` 

OR

findString=$(echo "$findString" | perl -0777pe 's/\t/\\t/g') 

OR

command="echo $findString | perl -0777pe 's/\t/\\t/g'" 
findString=eval($command) 
+1

不要建議使用反引號代替'$()',這是OP使用的。反過來,後一種形式[非常優選](http://mywiki.wooledge.org/BashFAQ/082)。 – 2012-08-03 01:25:52

+0

問題不在於反引號或$()是否有效。這只是一個建議。它比選擇更多的選擇,都做同樣的事情。 OP正在使用一個相當簡單的命令。如果它是一個複雜的嵌套命令,確保'$()'可以使代碼可讀。但對我來說,這兩者都是一樣的。爲了它,我正在更新答案。 – Annjawn 2012-08-03 01:59:21

+1

不,這兩個*都不會做和你似乎認識的事情相同的事情。可讀性問題包括避免單引號和反引號之間的混淆,即使是簡單的進程替換。你的陳述「我建議使用反引號」是促使我評論的原因。 – 2012-08-03 02:11:11

1

如@chepner已經在他的評論中指出,要使用echo,而不是catcat預計文件名爲cat,所以它將$findString作爲文件名。