我正在开展一个项目,我正在制作超过500个自述文件。每个文件包含以下内容(包括空格),我想为该任务创建一个bash脚本。我成功地使用bash从数据创建了所有自述文件,但是我在尝试找到使用sed
,grep
和regexs
的方法时遇到了麻烦。
现在的文件是什么样的:
"1.0.0": "text1"
"1.1.15": "text2"
"2.1.2": "text3"
"4.55.3a": "text4"
我希望看到的是什么:
**v4.55.3a**
- text 4
**v2.1.2**
- text 3
**v1.1.15**
- text 2
**v1.0.0**
- text 1
BASH SCRIPT(这将格式化文件中的字符串):
f=$(find . -type f -name README.md)
for item in $f; do
#format version
#format string
done
所以,我正在寻找一些帮助来构建一个格式化内容的脚本。感谢大家的意见。
更新
输入文件中的第1行是否真的缩进了?
- 有些是,有些不是
你真的想要输出中包含**的版本号吗?
- 是的,它用于github标记。
看起来您希望输出文件按版本号按降序排序,是否正确?
- 正确!
答案 0 :(得分:1)
输入和输出的格式与问题中当前指定的格式完全相同:
tac "$item" | awk -F\" '{ printf "**v%s**\n - %s\n", $2, $4 }' > "/tmp/$item" &&
mv "/tmp/$item" "$item"
注意:
sort -t. -r -b -n -k1.2,1 -k2,2 -k3,3 "$item"
)。tail -r
代替tac
。此外,最好不要使用for ... in
解析命令输出,因为这会破坏带有嵌入空格的路径。
更强大的解决方案是读入数组:
IFS=$'\n' read -r -d '' -a files <<<"$(find . -type f -name README.md)"
for item in "${files[@]}"; do
# ...
done
readarray -t files <<<"$(find . -type f -name README.md)"
代替。或者,直接在循环中处理find
的输出:
find . -type f -name README.md -print0 | while IFS= read -r -d '' item; do ...
答案 1 :(得分:0)
我猜你是我喜欢这样的人:
sort -r -k1 file | awk -F\" '{print "**v"$2"**\n -"$4"\n"}'
**v4.55.3a**
-text4
**v2.1.2**
-text3
**v1.1.15**
-text2
**v1.0.0**
-text1
它根据版本号对数据进行反转排序,然后分组打印出来。