bash中的解析列表

  • 本文关键字:列表 bash bash shell
  • 更新时间 :
  • 英文 :


我有一个文本文件,看起来像这样:

...
unique_trigger = item1
item2
item3
...
itemN
unique_end_trigger
...

是否有一个快速的(可能是在线的)bash脚本,我可以用它来解析文件和管道item1 item2 item3...到另一个命令?没有确定项目的数量。我研究了从文件中读取变量的其他bash脚本,但它们要么是源文件,要么是手动解析每个项目(预先确定的列表长度),要么是根据项目的名称为每个项目分配一个环境变量(这不是我的情况)。我在找这样的东西:

parse_command file.txt | other_command

perl:

perl -0777 -pE 's/.*unique_triggers*=s*(.*)unique_end_trigger.*/$1/s; s/^s+//gm' file.txt
item1
item2
item3
...
itemN

一行

cat file.txt | tr -s "[:space:]" " " | 
sed -En "s/(.*)(unique_trigger = )(.*)(unique_end_trigger)/3/p" | 
other_command
awk '/unique_end_trigger/&&--f||f||/unique_trigger/&&f++ {printf $1 " "}' <(sed 's/unique_trigger =/ & n /' input_file)
item1 item2 item3 ... itemN

不完全是一行代码,但只要您的触发器不包含空格,它应该可以达到目的。

flag=0
while read tr eq it ; do
if [ "$tr" = "unique_trigger" ] ; then
echo "$it"
flag=1
elif [ $flag = 1 ] ; then
if [ "$tr" = "unique_end_trigger" ] ; then
flag=0
else
echo "$tr"
fi
fi
done

两个解决方案,使用相同的概念。找到开始触发器后,将项目(该行中的第三个项目)添加到字符串中。在找到结束触发器之前,该项是行中唯一的工作项,因此将其添加到字符串中。输出末尾的字符串

Bash解析

#!/bin/bash
file="file.txt"
start_trigger="unique_trigger"
end_trigger="unique_end_trigger"
items=''
between_trigger="no"
while IFS= read -r line; do
#echo "-----$line-----"
# Start trigger lines
if [[ "$line" =~ "$start_trigger =" ]]
then
items="$items $(echo "$line" | awk '{print $3}')"
between_trigger="yes"
continue
fi
# End trigger lines
if [[ "$line" =~ "$end_trigger" ]]
then
between_trigger="no"
continue
fi
# Lines between start and end trigger
if [[ "$between_trigger" == "yes" ]]
then
items="$items $line"
continue
fi
done < "$file"
echo ">>$items<<"

使用:script.bash | xargs echo

用任意命令替换echo


Awk版本

BEGIN {
output = ""
between = "no"
}
/unique_end_trigger/ {
between = "no";
}
/.*/ {
if (between == "yes") output = output " " $1
}
/unique_trigger/ {
between = "yes";
output = output " " $3;
}
END { print output }

使用它:awk -f script.awk file.txt | xargs echo

用你想要的命令替换echo

相关内容

  • 没有找到相关文章

最新更新