如何使用shell脚本解析字符串以检索变量中字符串中的单词?

时间:2010-08-04 06:06:56

标签: shell

我有一个命令,在执行时会给出以下输出

$ cleartool pwv
Working directory view: abhijeet_trialProj_r2.4-phase1_ba_abhijeet_branch
Set view: abhijeet_trialProj_r2.4-phase1_ba_abhijeet_branch

$ cleartool pwv
Working directory view: ** NONE ** 
Set view: abhijeet_trialProj_r2.4-phase1_ba_abhijeet_branch

$ ct pwv 
Working directory view: ** NONE **
Set view: ** NONE **

我在shell脚本中使用此命令“cleartool pwv”。

view_used=`cleartool pwv`

因此$ view_used被赋予字符串“工作目录视图:**无**设置视图:abhijeet_trialProj_r2.4-phase1_ba_abhijeet_branch”

我需要从$ view_used中检索两个值

working_dir_view =“**** NONE ****”或“ abhijeet_trialProj_r2.4-phase1_ba_abhijeet_branch

set_view =“**** NONE ****”或“ abhijeet_trialProj_r2.4-phase1_ba_abhijeet_branch

有些人可以帮我解决这个问题吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

如果你有awk,

var=$(cleartool pwv |awk -F":" '/Working directory view/{
 t=$2
}/Set view/{s=$2}
END{
  print t,s
}
')
set -- $var
echo $1
echo $2

使用shell(bash)脚本

while IFS=":" read -r a b
do
  case "$a" in
   *"Working directory"* ) w="$b";;
   *"Set view"* ) s="$b";;
  esac
done <"file1"
echo "$w"
echo "$s"

答案 1 :(得分:0)

假设他们总是那种格式(两行,相同的顺序,冒号分隔符):

working_view="$(ct pwv | head -1 | sed 's/[^:]*: //')"
set_view="$(ct pwv | tail -1 | sed 's/[^:]*: //')"

如果您必须使用${view_used}(换句话说,如果您不想两次调用ClearCase工具),只需将其替换如下:

working_view="$(echo "${view_used}" | head -1 | sed 's/[^:]*: //')"
set_view="$(echo "${view_used}" | tail -1 | sed 's/[^:]*: //')"

答案 2 :(得分:0)

如果你有awk:

working_dir_view=$(cleartool pwv | awk '
  /Working directory view/ {gsub(/.*:\s+/,"");print $0}
')
set_view=$(cleartool pwv | awk '
  /Set view/ {gsub(/.*:\s+/,"");print $0}
')

如果你真的想从变量中的字符串中做到这一点:

working_dir_view=$(echo $view_used | awk '
  /Working directory view/ {gsub(/.*:\s+/,"");print $0}
')
set_view=$(echo $view_used | awk '
  /Set view/ {gsub(/.*:\s+/,"");print $0}
')

在脚本文件中,将它们重构为函数可能更具可维护性:

getView(){
    echo $2 | awk "/$1 view/ {gsub(/^.*:[ \t]+/,\"\");print\$0}"
}

现在你可以这样做:

working_dir_view=`getView "Working directory" "$view_used"`
set_view=`getView Set "$view_used"`