Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用bash查找并格式化500多个readme.md文件中的字符串_Regex_Bash_Sed_Grep - Fatal编程技术网

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

Regex 使用bash查找并格式化500多个readme.md文件中的字符串,regex,bash,sed,grep,Regex,Bash,Sed,Grep,我正在做一个项目,我正在整理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

我正在做一个项目,我正在整理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
f=$(find . -type f -name README.md)
for item in $f; do
  #format version
  #format string
done
我希望它看起来像什么:

"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
f=$(find . -type f -name README.md)
for item in $f; do
  #format version
  #format string
done
BASH脚本(这将格式化文件中的字符串):

"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
f=$(find . -type f -name README.md)
for item in $f; do
  #format version
  #format string
done
因此,我正在寻找一些帮助,以建立一个脚本,将格式的内容。谢谢大家的意见

更新
输入文件中除了第一行以外的所有行都是缩进的吗?
-有些是,有些不是。
您真的希望输出中包含**中的版本号吗?
-是的,它用于github标记。
看起来您希望输出文件按版本号降序排列,对吗?

-对

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

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
另外,最好不要用
为…解析命令输出。。。例如,在
中,这将与带有嵌入空格的路径断开

更可靠的解决方案是读入阵列:


我猜你喜欢这样的一些:

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

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

tac
不按版本号排序,只需反向排序即可<代码>看起来您希望输出文件按版本号降序排列,对吗?-对此外,简单地反转输入是否足以获得正确的输出顺序?是。@SJAndersonLA:刚刚更新了答案,说明了重新格式化后如何替换输入文件
| tee-test.md1
输出到标准输出和文件
test.md1
sort
命令无法正常工作;添加
-b
将有助于处理前导空格,但这仍然无法执行真正的版本号排序。要使其正常工作,您需要有点拜占庭式的
sort-t-r-b-n-k1.2,1-k2,2-k3,3文件