Sed регулярное выражение, чтобы соответствовать ['', 'WR' или 'RN'] + 2-4 цифры - PullRequest
0 голосов
/ 14 января 2011

Я пытаюсь выполнить некоторую условную обработку текста в Unix и борюсь с синтаксисом.Я хочу достичь

Find the first 2, 3 or 4 digits in the string
if 2 characters before the found digits are 'WR' (could also be lower case)
    Variable = the string we've found (e.g. WR1234)
    Type = "work request"
else
    if 2 characters before the found digits are 'RN' (could also be lower case)
      Variable = the string we've found (e.g. RN1234)
      Type = "release note"
    else
      Variable = "WR" + the string we've found (Prepend 'WR' to the digits)
      Type = "Work request"
    fi
fi

Я делаю это в оболочке Bash на Red Hat Enterprise Linux Server версии 5.5 (Tikanga)

Заранее спасибо, Карл

Ответы [ 3 ]

1 голос
/ 14 января 2011

Мне нравится использовать perl -pe вместо sed, потому что в PERL есть такие выразительные регулярные выражения.Ниже приведено несколько подробных инструкций:

example.txt :

WR1234 - Work Request name.doc
RN456
rn456
WR7890 - Something else.doc
wr789
2456

script.sh :

#! /bin/bash

# search for 'WR' or 'RN' followed by 2-4 digits and anything else, but capture 
# just the part we care about
records="`perl -pe 's/^((WR|RN)([\d]{2,4})).*/\1/i' example.txt`"

# now that you've filtered out the records, you can do something like replace 
# WR's with 'work request'
work_requests="`echo \"$records\" | perl -pe 's/wr/work request /ig' | perl -pe 's/rn/release note /ig'`"

# or add 'WR' to lines w/o a listing
work_requests="`echo \"$work_requests\" | perl -pe 's/^(\d)/work request \1/'`"

# or make all of them uppercase
records_upper=`echo $records | tr '[:lower:]' '[:upper:]'`

# or count WR's
wr_count=`echo "$records" | grep -i wr | wc -l`
echo count $wr_count

echo "$work_requests"
1 голос
/ 14 января 2011
#!/bin/bash
string="RN12344 - Work Request Name.doc"
echo "$string" | gawk --re-interval '
{
    if(match ($0,/(..)[0-9]{4}\>/,a ) ){
        if (a[1]=="WR"){
            type="Work release"
        }else if  ( a[1] == "RN" ){
            type = "Release Notes"
        }
        print type
    }
}'
1 голос
/ 14 января 2011

Я не уверен, как вы читаете в своих строках, но этот пример должен помочь вам туда добраться.Я перебираю 4 примера строки, WR1234 RN456 7890 PQ2342.Вы не сказали, что делать, если строка не соответствует ожидаемому формату (PQ2342 в моем примере), поэтому мой код просто игнорирует ее.

#!/bin/bash

for string in "WR1234 - Work Request Name.doc" "RN5678 - Release Note.doc"; do
  [[ $string =~ ^([^0-9]*)([0-9]*).*$ ]]
  case ${BASH_REMATCH[1]} in
    "WR")
          var="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
          type="work request"
          echo -e "$var\t-- $type"
          ;;
    "RN")
          var="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
          type="release note"
          echo -e "$var\t-- $type"
          ;;
    "")
          var="WR${BASH_REMATCH[2]}"
          type="work request"
          echo -e "$var\t-- $type"
          ;;
  esac
done

Вывод

$ ./rematch.sh
WR1234  -- work request
RN5678  -- release note
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...