Bash比较目录中的字符串

时间:2011-06-09 15:57:51

标签: linux bash unix

您好我正在尝试比较目录中的两个字符串。格式如下。

{sametext}difference{sametext}

注意:{sametext}对于每个文件都不是静态的

例如

myfile_1_exercise.txt

相比,

myfile_2_exercise.txt

你能告诉我如何在if语句中匹配上述字符串。

基本上我需要知道如何忽略两个字符串中的数字,以便它们相同。

一些示例代码如下所示:

我的示例代码如下所示:

for g in `ls -d */`;
do                      
  if [ -d $g ]; then 
    cd $g                 # down 1 directories
    for h in `ls *root`;
    do
      printf "${Process[${count}]} = ${basedir}/${f}${g}${h}\n"
      h1=${h}

      if [ "${h1}" = "${h2}" ]; then # NEED to MATCH SOME HOW??????????
        echo we have a match
      fi

      h2=${h1}
      let count+=1
    done

    cd ../
    #printf "\n\n\n\n"      
  fi
done

确定此项而不是"${h1}" = "${h2}"的测试应该是什么?

干杯,

麦克

4 个答案:

答案 0 :(得分:3)

sed在这里派上用场。

这基本上遍历目录中的每个文件,从文件名中提取两个字符串,并保留其所有唯一组合的列表。

然后,它遍历此列表,并使用bash的通配符扩展来允许您遍历每个集合。

编辑:摆脱丑陋的黑客攻击。

i=0
for f in *_*_*.txt
do
    a=`echo "$f" | sed 's/\(.*\)_.*_\(.*\).txt/\1/g'`
    b=`echo "$f" | sed 's/\(.*\)_.*_\(.*\).txt/\2/g'`

    tmp=${all[@]}
    expr match "$tmp" ".*$a:$b.*" >/dev/null
    if [ "$?" == "1" ]
    then
      all[i]="$a:$b"
      let i+=1
    fi
done

for f in ${all[@]}
do
    a=`echo "$f" | sed 's/\(.*\):\(.*\)/\1/g'`
    b=`echo "$f" | sed 's/\(.*\):\(.*\)/\2/g'`
    echo $a - $b
    for f2 in $a_*_$b.txt
    do
        echo "  $f2"
        # ...
    done
done

当然,这假设您关注的所有文件都遵循*_*_*.txt模式。

答案 1 :(得分:3)

"myfile_1_exercise.txt" == "myfile_2_exercise.txt"

你的意思是上面的测试应该返回true(忽略数字)吧? 这就是我要做的事情:

h1="myfile_1_exercise.txt"
h2="myfile_2_exercise.txt"
if [ $( echo ${h1} | sed 's/[0-9]*//g' ) == $( echo ${h2} | sed 's/[0-9]*//g' ) ] ; then 
    # do something here.
fi

答案 2 :(得分:2)

免责声明:

  1. 里程可能会有所不同,您可能需要针对极端情况调整和调试脚本。
  2. 您可能最好使用Perl来完成任务。
  3. 即使在Bash中也可能有更好的解决方案。这个效率不高,但似乎有效。
  4. 说,这是一个根据您的要求比较两个字符串的脚本。我相信您可以在目录列表脚本中找到如何使用它(顺便提一下,您可能需要考虑find

    此脚本需要两个字符串并打印匹配!如果匹配

    $ bash compare.sh myfile_1_exercise.txt myfile_2_exercise.txt
    match!
    $ bash compare.sh myfile_1_exercise.txt otherfile_2_exercise.txt
    $
    

    剧本:

    #!/bin/bash
    fname1=$1
    fname2=$2
    
    findStartMatch() {
      match=""
      rest1=$1 ;
      rest2=$2 ;
      char1=""
      char2=""
      while [[  "$rest1" != "" && "$rest2" != "" && "$char1" == "$char2" ]] ; do
        char1=$(echo $rest1 | sed 's/\(.\).*/\1/');
        rest1=$(echo $rest1 | sed 's/.\(.*\)/\1/') ;
        char2=$(echo $rest2 | sed 's/\(.\).*/\1/');
        rest2=$(echo $rest2 | sed 's/.\(.*\)/\1/') ;
        if [[ "$char1" == "$char2" ]] ; then
          match="${match}${char1}"
        fi
      done
    }
    
    findEndMatch() {
      match=""
      rest1=$1 ;
      rest2=$2 ;
      char1=""
      char2=""
      while [[  "$rest1" != "" && "$rest2" != "" && "$char1" == "$char2" ]] ; do
        char1=$(echo $rest1 | sed 's/.*\(.\)/\1/');
        rest1=$(echo $rest1 | sed 's/\(.*\)./\1/') ;
        char2=$(echo $rest2 | sed 's/.*\(.\)/\1/');
        rest2=$(echo $rest2 | sed 's/\(.*\)./\1/') ;
        if [[ "$char1" == "$char2" ]] ; then
          match="${char1}${match}"
        fi
      done
    }
    
    findStartMatch $fname1 $fname2
    startMatch=$match
    findEndMatch $fname1 $fname2
    endMatch=$match
    
    if [[ "$startMatch" != "" && "$endMatch" != "" ]] ; then
      echo "match!"
    fi
    

答案 3 :(得分:0)

如果您实际上正在比较您提到的两个文件...可能您可以使用diff命令

diff myfile_1_exercise.txt myfile_2_exercise.txt