使用 shell 迭代某些模式

使用 shell 迭代某些模式

我有一个文件需要处理并从中获取一些条目。文件格式为:

输入示例:

String1:"Hello"
String2:"World"
String3:"Question"
End
String1:"HelloAgain"
String5:"Answer"
End
String1:"NewEntry"
String2:"Foo"
String5:"NewFile"
End

脚本将迭代并尝试找到 String1 并打印它,如果 String2 也存在于该块中,则将其附加到 String1 并打印。

示例输出:

Hello World
HelloAgain
NewEntry Foo

我需要循环遍历每个这样的块。这里的块的意思是每个“End”字符串之间的内容。我有一个像这样的脚本:

    cat $1 | while read line
do
    if [[ $line == "String1="* ]];
    then
        string1=$line
    fi
    if [[ $line == "String2="* ]];
    then
        string2=$line
    fi
    if [[ $line == "End" ]];
    then
        if [ $string1 ];
            then
            echo "string1/"$string1"
        fi
        if [ $string1 ] && [ $string2 ];
            then
            echo $string1" "$string2
        fi
    #Reset values
    string1=''
    string2=''
    fi
done

该代码工作正常,但这些块之间的处理可能会变得更加复杂,迭代这些块并处理这些块条目的最佳方法是什么。

注意:该文件是一种属性文件。

答案1

鉴于您提供的输入和请求的输出:

$ awk -F: '$0 == "End" { printf "\n" } $1 ~ /^String[12]$/ { gsub( /\"/, "", $2 ); printf( "%s ", $2)}' input
Hello World
HelloAgain
NewEntry Foo

答案2

perl -F':|"' -lane 'if ($out && $_ eq "End") {print "$out"; $out=""};
  $out  = $F[2] if ($F[0] eq "String1");
  $out .= $F[2] if ($out && $F[0] eq "String2")' input.txt

此 perl 脚本使用:"作为字段分隔符,以避免需要从输出中删除双引号。这意味着我们需要提取第三字段而不是第二个字段,因为现在第一个字段:". Perl 数组是从零开始的,所以那就是$F[2].

如果有东西要打印,它只打印记录(“块”)的输出,无论是 String1 本身或者String1 和 String2 存在 - 即它不会为不匹配的记录打印空行。

这是相同的算法awk

awk -F':|"' 'out && $0 == "End"  { print out; out="" };
  $1 == "String1" { out=$3 };
  out && $1 == "String2" { out = out$3 }' input.txt

相关内容