我有一份報告(簡單文本檔案)需要更新(通過 bash)以供服務使用。
該報告由類別串列組成,每個類別都有一個專案串列,類似于以下示例:
vehicle:
car
moto
done
fruit:
banana
apple
done
tree:
pine
oak
done
更新的目的是在特定類別的最后一個之后添加新專案:
添加
orange到fruit之后apple
為此,我創建了一個小示例腳本來測驗/除錯此程序/更新使用sed:
#!/bin/bash
file=report.txt
cat > "$file" << EOT
vehicle:
car
moto
done
fruit:
banana
apple
done
tree:
pine
oak
done
EOT
category="fruit"
append="orange"
## only $category has $append - but at start:
#find_lhs="^$category:"
#replace_rhs="$category:\n$append"
## all categories have $append at end:
#find_lhs="([\S\s]*?)done"
#replace_rhs="\1$append\ndone"
# add $append at the end of $category - nothing happens:
find_lhs="^$category:([\S\s]*?)done"
replace_rhs="$category:\n\1$append\ndone"
sed -i -E "s/$find_lhs/$replace_rhs/g" "$file"
cat "$file"
問題:
缺少/失敗的內容:
sed -i -E "s/^$category:([\S\s]*?)done/$category:\n\1\n$append\ndone/g" "$file"
生成以下報告內容:
vehicle:
car
moto
done
fruit:
banana
apple
orange #<-- inserted
done
tree:
pine
oak
done
??
免責宣告:
- 已經嘗試過:
- sed:在塊之后追加
- 在匹配文本塊后使用 sed 插入一行
- 使用 sed 附加文本的正則運算式
- ... 和別的...
- 但可能不是以正確的方式...
- 意識到使用
awk,perl或python其他工具/語言會簡單得多- 但為什么不直接使用
sed?!
- 但為什么不直接使用
uj5u.com熱心網友回復:
使用sed
$ sed "/$category/,/done/{/done/s/^/$append\n/}" <<< "$file"
$ sed "/$category/{:a;/done/s/^/$append\n/;n;/^$/!ba}" file
$ sed -e "/$category/{:a;/done/i$append" -e 'n;/^$/!ba}' file
輸出
vehicle:
car
moto
done
fruit:
banana
apple
orange
done
tree:
pine
oak
done
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed -e '/fruit:/,/done/{/done/i\orange' -e '}' file
專注于水果類別并orange在類別分隔符之前插入 ie done。
注意 該解決方案分為兩部分,因為i命令需要換行符或另一個命令集。
選擇:
sed '/fruit:/,/done/!b;/done/i\orange' file
uj5u.com熱心網友回復:
作為替代方案,這是gnu-awk使用 custom 完成作業的一個RS:
awk -v append='\norange' -v category='fruit:' -v RS='\ndone\n' '
{ORS=RT} $1 == category {$0 = $0 append} 1' file
vehicle:
car
moto
done
fruit:
banana
apple
orange
done
tree:
pine
oak
done
EOT
要將更改保存到同一檔案中,請使用:
awk -i inplace -v append='\norange' -v category='fruit:' -v RS='\ndone\n' '{ORS=RT} $1 == category {$0 = $0 append} 1' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483476.html
上一篇:如何在bash中傳輸變數
