使用bash查找并格式化超过500个readme.md文件中的字符串

时间:2014-05-14 05:07:29

标签: regex bash sed grep

我正在开展一个项目,我正在制作超过500个自述文件。每个文件包含以下内容(包括空格),我想为该任务创建一个bash脚本。我成功地使用bash从数据创建了所有自述文件,但是我在尝试找到使用sedgrepregexs的方法时遇到了麻烦。

现在的文件是什么样的:

"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标记。
看起来您希望输出文件按版本号按降序排序,是否正确?
- 正确!

2 个答案:

答案 0 :(得分:1)

输入和输出的格式与问题中当前指定的格式完全相同:

tac "$item" | awk -F\" '{ printf "**v%s**\n - %s\n", $2, $4 }' > "/tmp/$item" &&
  mv "/tmp/$item" "$item"

注意:

  • 这假设只需反转输入顺序就足以获得所需的输出排序[由OP确认] - 如果需要进行真正的排序,则会变得更加棘手 (sort -t. -r -b -n -k1.2,1 -k2,2 -k3,3 "$item")。
  • 在OSX上,使用tail -r代替tac

此外,最好不要使用for ... in解析命令输出,因为这会破坏带有嵌入空格的路径。

更强大的解决方案是读入数组

IFS=$'\n' read -r -d '' -a files <<<"$(find . -type f -name README.md)"
for item in "${files[@]}"; do
   # ...
done
  • 唯一需要注意的是,路径不能包含嵌入的换行符,但这通常不是问题。
  • 如果您正在使用bash 4+,则可以使用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

它根据版本号对数据进行反转排序,然后分组打印出来。