如何sed某些表达式?

如何sed某些表达式?

我已经处理这个问题有一段时间了,但没有成功。我需要 sed 这个

1.0.0/hk/base/9/7/56.png2003444

进入这个

hk,9,7,56,200,3444

任何帮助将不胜感激。

编辑。

第一行代表文件内的字符串。第二行 - 结果将在 CSV 文件中使用。

该部分包含固定数量的字符(始终):1.0.0/hk/base/ 该部分可能因字符数量而异:9/7/56 2003444

我被告知要这样做:

-e 's/\/base\//,/g'

将返回:

1.0.0/hk,9/7/56.png2003444

但我不知道如何处理其他事情。

答案1

对于这个字符串,这个转换应该有效:

sed 's|.*/\(.*\)/.*/\(.*\)/\(.*\)/\(.*\)\.png\(...\)\(....\)|\1,\2,\3,\4,\5\,\6|'

如果其他行不完全是格式,您将遇到问题 - 包括最后两部分的长度是否不同。

答案2

因为它是一个文件,所以我会在 Vim 中完成它。维姆的非常神奇正则表达式非常易读,因此是很好的教育资源:

:%s_\v^.{6}([^/]+)/([^/]+)/(\d+)/(\d+)/(\d+)\.png(\d{3})(\d{4})_\1,\2,\3,\4,\5,\6,\7_
  • \v开启非常神奇的功能
  • ^从行首开始匹配
  • .{6}获取前 6 个字符 ( 1.0.0/)
  • ([^/]+)任何不是/( hk)的东西
  • //
  • ([^/]+)我们之前见过(base这次匹配)
  • /-- || -- || --
  • (\d+)匹配数字 ( 9)
  • /(\d+)/(\d+)重复珍贵的东西 ( /7/56)
  • \.png这应该是显而易见的
  • (\d{3})恰好三个数字200
  • (\d{,4})最多 4 个数字(以使其更加稳健):3444

sed(与every一起使用{}()[]需要转义和\v删除)

答案3

您还没有告诉我们您正在解析的文本的结构,或者您想要搜索的模式。因此,我根据您给我们的示例做了一些假设 ( 1.0.0/hk/base/9/7/56.png2003444)。

我使用了扩展正则表达式 ( -r),因为转义圆括号和方括号会使脚本难以阅读。我使用分号 ( ;) 而不是斜杠 ( /) 来分隔命令,这样我也不需要转义斜杠。

sed -r 's;([0-9]+\.){2}[0-9]+/([a-zA-Z]+)/[a-zA-Z]+/([0-9]+)/([0-9]+)/([0-9]+)\.[a-zA-Z]{3}([0-9]{3})([0-9]{4});\2,\3,\4,\5,\6,\7;g'

答案4

感谢所有的答复。我是编程世界的新手,这对我来说也是一个新事物,所以我想我需要学习很多东西,因为这sed是处理这些东西的老派方法。然而,由于我遵循了我熟悉的某种方法,所以我最终解决了这样的问题:

sed -e 's/1.0.0\///g'     \
    -e 's/\/base\//,/g'   \
    -e 's/\//,/g'         \
    -e 's/.png/,/g'       \
    -e 's/,\([0-9][0-9][0-9]\)\([0-9]*\)$/,\1,\2/g'

相关内容