0

1行のPerlコマンドを使用して、Bash変数のデータを変更したいと思います。問題は、Perlのワンライナーがパイプされたデータを受信して​​いないことだと思います。

私はbash変更変数について知っています。findString=${findString//\//\\/}

Perlも動作させることに興味があります。私はPerlを知らないので、単純にしてください。

明確にするために、これらの2行は機能していません。テキストのタブを\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ます。catcatにはファイル名が必要なので$findString、ファイル名として扱われます。

于 2012-08-02T20:37:29.483 に答える