开发者

sed regex to match ['', 'WR' or 'RN'] + 2-4 digits

I'm trying to do some conditional text processi开发者_如何学JAVAng on Unix and struggling with the syntax. I want to acheive

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

I'm doing this in a Bash shell on Red Hat Enterprise Linux Server release 5.5 (Tikanga)

Thanks in advance, Karl


I'm not sure how you read in your strings but this example should help you get there. I loop over 4 example strings, WR1234 RN456 7890 PQ2342. You didn't say what to do if the string doesn't match your expected format (PQ2342 in my example), so my code just ignores it.

#!/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

Output

$ ./rematch.sh
WR1234  -- work request
RN5678  -- release note


I like to use perl -pe instead of sed because PERL has such expressive regular expressions. The following is a bit verbose for the sake of instruction.

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"


#!/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
    }
}'
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜