我已经处理这个问题有一段时间了,但没有成功。我需要 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'