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" 

я успешно изменил одну линию, как я хотел, но только одна строка, я хочу изменить все линии, которые имеют мне условия, как в примере, я также сделал другие примеры губят мой код, как:

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 -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\" \)\"[^\"]*\" соответствует правильные линии. После неэкранированного и замены будет выглядеть следующим образом |\(AFFICCheckCtlNo " \)"[^"]*"
  • В скобках мы фиксируем ту часть, которую мы хотим повторить
  • Замены \1\"$2\" состоит из запомненных частей, как |AFFICLstRcvdCtlNo", а затем добавляет "yourstring", как "hola"
Смежные вопросы