通过Perl更改Bash变量

时间:2012-08-02 17:45:52

标签: perl bash command-line

我想使用一行Perl命令来更改Bash变量中的数据。我认为问题是Perl one liner没有收到数据中的管道。

我知道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 

2 个答案:

答案 0 :(得分: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 :(得分:1)

正如@chepner在评论中已经指出的那样,您希望使用echo代替catcat期望文件名为cat,因此它将$findString视为文件名。