例如:
猫文件1
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>
即由模式分隔的 3 行集合(或只是值也可以"<SHOUT>"
模式应该在其中与一些分隔符连接起来。最好的方法是什么?
我一直在尝试的方法是通过管道(|)搜索替换(在 vi 中使用 %s/A/B)模式(跨越 2 行)"\Nb="和"\Nc="。我以前做过这种方式,但我只是不明白。 是换行符 (控件-M)
编辑:
我能够找到一种使用简单搜索替换来做到这一点的方法。我从 vi 中做了以下工作。
:%s/"nb="/|/g
:%s/"nc="/|/g
其中 是换行符。
这两个命令将每次出现的"b="和"c="替换为 pipe(|) 字符。然后我只是使用类似的命令将开头 a=" 和结尾 " 替换为 null。
:%s/a="//g
:%s/"//g
谢谢大家的回答。
while read line; do
if [ "$line" = "<SHOUT>" ]; then
echo
echo $line
prefix=""
else
echo -n "$prefix${line#*=}"
prefix=" | "
fi
done < file1
编写一个 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
使用 awk 你可以做到:
awk 'NF{gsub(/.=/, ""); gsub(/n/, " | "); printf "%sn%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>