【问题标题】:Need help to convert sed script to python script需要帮助将 sed 脚本转换为 python 脚本
【发布时间】:2018-11-09 11:04:24
【问题描述】:

示例 sed 命令:

$ echo "/dev/sda1 /dev/xvdb3" | sed -r 's%(/dev/)(xv|s)(d[a-z])[0-9]*%\1(xv|s)\3%g' 
/dev/(xv|s)da /dev/(xv|s)db

如何转换成python代码?

尝试了以下代码:

device = "/dev/sda5"
m = re.match(r"(/dev/)(xv|s)(d[a-z])", device)
print m.group(0)

出现错误:

print m.group(0)
AttributeError: 'NoneType' object has no attribute 'group'

【问题讨论】:

  • 我想帮助你摆脱 sed 以支持 python,但它真的太宽泛了,而且是“为我写代码”的请求。对不起,我不能原谅。
  • sed 只是一个使用正则表达式的操作工具。考虑将re 库与re.compilere.search/re.matchre.sub 一起使用
  • 只是一个提示:sed 一次读取一行,对其应用转换(这里是基于单个正则表达式的替换)并输出该行。 python 转换将是一个脚本:1/ 从标准输入读取行 (for line in sys.stdin:),2/ 应用替换(使用 re 模块)和 3/ 输出更改的行(printsys.stdout.write )。编写一些代码,如果卡在某个地方,请随时提出更精确的问题......

标签: python sed


【解决方案1】:
re.match(r"(/dev/)(xv|s)(d[a-z])", device)

不起作用,因为您需要转义 (xv|s) 中的括号。加上match 只尝试在字符串的开头进行匹配。你想让re.sub模仿sed

无论如何,转换sed 命令非常容易。只需根据您的模式中的% 进行拆分,并使用原始字符串前缀替换\1 等(或python 转义序列妨碍)

使用您的精确搜索和替换表达式:

re.sub("(/dev/)(xv|s)(d[a-z])[0-9]*",r"\1(xv|s)\3","/dev/sda1 /dev/xvdb3")

打印:

/dev/(xv|s)da /dev/(xv|s)db

【讨论】:

  • 这正是我想要的。非常感谢!
猜你喜欢
  • 2021-12-14
  • 2019-10-16
  • 2023-03-03
  • 2017-06-22
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2018-08-08
相关资源
最近更新 更多