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
感谢大家的回答。
答案 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>