0

我想使用一行 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 
4

2 回答 2

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'`

或者

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

或者

command="echo $findString | perl -0777pe 's/\t/\\t/g'"
findString=eval($command)
于 2012-08-02T18:15:14.923 回答
1

正如@chepner 在他的评论中已经指出的那样,您想使用echo而不是cat. cat期望 cat 的文件名,因此它被视为$findString文件名。

于 2012-08-02T20:37:29.483 回答