我有一個如下所示的文本檔案:
...
unique_trigger = item1
item2
item3
...
itemN
unique_end_trigger
...
是否有一個快速的(如果可能的話,可能是在線的)bash 腳本可以用來決議檔案并通過管道傳輸item1 item2 item3...到另一個命令中?專案數量未確定。我查看了其他 bash 腳本以從檔案中讀取變數,但它們要么獲取它,要么手動決議每個專案(預定串列長度),要么根據每個專案的名稱為每個專案分配一個環境變數(這不是我的情況)。我正在尋找這樣的東西:
parse_command file.txt | other_command
uj5u.com熱心網友回復:
perl:
perl -0777 -pE 's/.*unique_trigger\s*=\s*(.*)unique_end_trigger.*/$1/s; s/^\s //gm' file.txt
item1
item2
item3
...
itemN
uj5u.com熱心網友回復:
單線
cat file.txt | tr -s "[:space:]" " " | \
sed -En "s/(.*)(unique_trigger = )(.*)(unique_end_trigger)/\3/p" | \
other_command
uj5u.com熱心網友回復:
awk '/unique_end_trigger/&&--f||f||/unique_trigger/&&f {printf $1 " "}' <(sed 's/unique_trigger =/ & \n /' input_file)
item1 item2 item3 ... itemN
uj5u.com熱心網友回復:
不是很單行,但只要您的觸發器不包含空格,它就可以解決問題。
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
uj5u.com熱心網友回復:
兩種解決方案,使用相同的概念。找到啟動觸發器后,將專案(行中的第 3 個專案)添加到字串中。在找到結束觸發器之前,該專案是該行中唯一的作業,因此將其添加到字串中。最后輸出字串。
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為您想要的任何命令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471514.html
