2016-05-25 3 views
1

こんにちは、私はテキストを処理するスクリプトを書いています誰もが、次のようにテキストが見えます:正しい出力を得るためにこのスクリプトを修正するには?

"TW|223SDSDr33|Archive" "Yes" 
"TW|ASFFSDFSFASDFS|Name" "LOCALggr" 
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" "" 
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf" 
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported" 
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst" 
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test" 
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs" 
"TW|sfasfsSFSAFAS|AFFCharSet" "13A" 
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "" 
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf" 
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs" 

アイデアは次のようにこのコードを実行することです:

bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt 

そして、所望の出力it' Sこの:

"TW|223SDSDr33|Archive" "Yes" 
"TW|ASFFSDFSFASDFS|Name" "LOCALggr" 
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" "" 
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf" 
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported" 
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst" 
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test" 
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs" 
"TW|sfasfsSFSAFAS|AFFCharSet" "13A" 
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "hola" 
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "hola" 
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs" 

フラグ--string1後の最初のパラメータは、我々はこの文字列の後に値を変更されるラインで検索したい文字列、VALUですeを引用符で囲み、フラグの後の値--string2は新しい値です。フラグ--textの後の値は、これを達成するために情報を含むファイルの名前です。以下を試してみましょう:

#!/bin/bash 
function menu() { 
     while (($# >= 1)) 
     do 
     key="$1" 
     case $key in 
       --text) 
       text=$2 
       shift 
       ;; 
       --string1) 
       string1=$2 
       shift 
       ;; 
       --string2) 
       string2=$2 
       shift 
       ;; 
     esac 
     shift 
     done 
} 
function replaceString() { 
     cat "$1" | sed -e 's/\("[\w\|]+\|'"$2"'"\) "[\w ]*"/\1 '\""$3"\"'/g' > newText.txt 
     cat newText.txt 
} 
menu "[email protected]" 
replaceString $text $string1 $string2 

次のように私はそれを実行しました:

bash script.sh --string1 AFFICCheckCtlNo --string2 hola --text text.txt 

そして、私が得た:

"TW|223SDSDr33|Archive" "Yes" 
"TW|ASFFSDFSFASDFS|Name" "LOCALggr" 
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" "" 
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf" 
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported" 
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst" 
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test" 
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs" 
"TW|sfasfsSFSAFAS|AFFCharSet" "13A" 
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "hola" 
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf" 
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs" 

私は私が望んだとして成功した1行を変更しましたが、ちょうど1行、私はすべて変更したいですsaを持つ行例のように私の条件、私はまた、私のコードを台無しに他の例を作った:

bash script.sh --string1 AFFCharSet --string2 hola --text text.txt 

そして、私が得た:

"TW|223SDSDr33|Archive" "Yes" 
"TW|ASFFSDFSFASDFS|Name" "LOCALggr" 
"TW|AFFSFSFSDFSFASDFS|AFFAckAssocCd" "" 
"TW|12AFFFSDFASFSFASDFS|AFFAckCommID" "fsdf" 
"TW|FSFASFFSDFSFASDFS|AFFAckLevel" "fsdf Supported" 
"TW|AFFSDFAASFSA|AFFAckRqst" "No Requedfst" 
"TW|AFFSDFSFASDFS|AFFAckTestInd" "Test" 
"TW|sfasfsSFSAFAS|AFFAckVersion" "fsdfs" 
"TW|sfasfsSFSAFAS|AFFCharSet" "13A" 
"TW|sfasfsSFSAFAS|AFFICCheckCtlNo" "" 
"TW|AFSFFASFASSFA13A13|AFFICCheckCtlNo" "fsdf" 
"TW|sfasfsSFSAFAS|AFFICLstRcvdCtlNo" "fsdfs" 

スクリプトは変更しなかった、これがあれば、私は知られていません私の正規表現に関連する問題は、私のコードを修正するための提案を感謝したいと思います。

答えて

2

sedは、\wをサポートしていません。代わりに[:alnum:]を使用してください(サポートされている場合)。

また、私のsedのバージョンが+が(それはここでは「代替」を意味するものではありません)|をバックスラッシュするために文字通りとないそれと一致しないようにバックスラッシュする必要があります。

sed -e 's/\("[[:alnum:]|]\+|'"$2"'"\) "[[:alnum:] ]*"/\1 "'"$3"'"/g' 
+0

ありがとう、本当に助けに感謝します。 – neo33

1

これは、このための短いスクリプトです:

#!/usr/bin/bash 

sed "s/|\($1\" \)\"[^\"]*\"/\1\"$2\"/g" $3 

は使用方法:./script.sh AFFICCheckCtlNo hola text2.txt

説明:

  • "s///g"は、テキストを置き換えて、変数
  • |\($1\" \)\"[^\"]*\"は、右の行と一致して渡します。アンエスケープと置換した後、それは、我々は
  • 交換\1\"$2\"|AFFICLstRcvdCtlNo"のように、思い出した部分から構成されており、それが"hola"
  • のように、 "yourstring"を追加を繰り返したい部分をキャプチャ括弧で
  • |\(AFFICCheckCtlNo " \)"[^"]*"次のようになります。
関連する問題