如何将由模式分隔的多条线连接到Vi中的一条线

时间:2014-02-12 10:19:26

标签: string bash vi

E.g:

cat file1

a="Ajim 123 Bagwan"
b="Johnny 120 Boy"
c="Bad 777 Girl"
<SHOUT>
a="Aj 30 Bag"
b="John 10 Boycott"
c="Badlands 20 Malick"
<SHOUT>
.........

我的输出应如下所示:

"Ajim 123 Bagwan" | "Johnny 120 Boy" | "Bad 777 Girl"
<SHOUT>
"Aj 30 Bag" | "John 10 Boycott" | "Badlands 20 Malick"
<SHOUT>

即。由模式"<SHOUT>"分隔的3行(或者只是值也会这样)的集合应该与它们中的某个分隔符连接在一起。这样做的最佳方式是什么?

我一直在尝试的方法是通过搜索替换(在vi中使用%s / A / B)模式(跨越2行)“\ Nb =”和“\ Nc =”由管道(|) 。我以前做过这种方式,但我只是没有得到它。 \ N是换行符(Control-M)

编辑:

我能够通过简单的搜索替换找到一种方法。我从vi做了以下。

:%s/"\nb="/|/g
:%s/"\nc="/|/g

其中\ n是换行符。

这两个命令用管道(|)字符替换每次出现的“\ nb =”和“\ ncc =”。 然后我用类似的命令用null替换了开头a =“和结尾”。

:%s/a="//g
:%s/"//g

感谢大家的回答。

3 个答案:

答案 0 :(得分:1)

while read line; do
   if [ "$line" = "<SHOUT>" ]; then
       echo
       echo $line
       prefix=""
   else
       echo -n "$prefix${line#*=}"
       prefix=" | "
   fi
done < file1 

答案 1 :(得分:0)

编写shell脚本(test.sh):

read acc
while read line; do
    if [ "$line" == "<SHOUT>" ]
    then
        echo "$acc"
        echo "<SHOUT>"
        read acc
    else
        acc="$acc | $line"
    fi
done
echo "$acc"

在命令行中运行此脚本:sh test.sh&lt;文件1

答案 2 :(得分:0)

使用awk你可以这样做:

awk 'NF{gsub(/.=/, ""); gsub(/\n/, " | "); printf "%s\n%s", $0, RS}' RS='<SHOUT>\n' file
"Ajim 123 Bagwan" | "Johnny 120 Boy" | "Bad 777 Girl" | 
<SHOUT>
"Aj 30 Bag" | "John 10 Boycott" | "Badlands 20 Malick" | 
<SHOUT>