【发布时间】:2020-06-19 17:14:16
【问题描述】:
我在使用 Python 插入一些文本时遇到了一些问题。我有一个文件,Package.swift,内容如下:
targets: [
.target(
name: "LibCore",
path: "lib/core/"
),
.target(
name: "LibAppData",
dependencies: ["LibCore"],
path: "lib/appdata/",
swiftSettings: [.define("appdata")]
),
我想在开头的targets: [ 正下方插入一个新的.target()
这可以在 zsh 中使用 awk:
awk '{print} /\.target\(/ && !n {print " name: \"{full_name}\",\n dependencies: \[\"LibCore\"\],\n path: \"lib\/{short_name}\/\",\n swiftSettings: [.define(\"{short_name}\")]\n ),\n .target("; n++}' Package.swift > Package-new.swift && mv Package-new.swift Package.swift
我在 Python 中尝试过以下操作:
subprocess.call([f"awk '{print} /\\.target\\(/ && !n {{print " name: "{full_name}\",\n dependencies: \\[\"LibCore\"\\],\n path: \"lib\\/{short_name}\\/\",\n swiftSettings: [.define(\"{short_name}\")]\n ),\n .target("; n++ "}}' Package.swift > Package-new.swift && mv Package-new.swift Package.swift"], shell=True)subprocess.call(['awk.exe', '{print} /\\.target\\(/ && !n {print " name: \"{full_name}\",\n dependencies: \\[\"LibCore\"\\],\n path: \"lib\\/{short_name}\\/\",\n swiftSettings: [.define(\"{short_name}\")]\n ),\n .target("; n++}', 'Package.swift'])tmp=tempfile.mkstemp() with open("Package.swift") as fd1, open(tmp[1],'w') as fd2: for line in fd1: line = line.replace("\\.target\\(",f" name: \"{full_name}\",\n dependencies: \\[\"LibCore\"\\],\n path: \"lib\\/{short_name}\\/\",\n swiftSettings: [.define(\"{short_name}\")]\n ),\n .target(") fd2.write(line) os.rename(tmp[1],"Package.swift")newtext = '''\ name: "{full_name}\",\n dependencies: \\[\"LibCore\"\\],\n path: \"lib\\/{short_name}\\/\",\n swiftSettings: [.define(\"{short_name}\")]\n ),\n .target( ''' filename = 'Package.swift' for line in fileinput.input([filename], inplace=True, backup='.bak'): if re.match(r'\\.target\\(', line): sys.stdout.write(newtext.format(l=line)) else: sys.stdout.write(line)
我也尝试了许多变体以逃避 {},但每次我尝试运行脚本时仍然收到 SyntaxError: invalid syntax。如果不是很明显,Python 不是我的第一语言????
有人知道我错过了什么吗?
谢谢!
【问题讨论】:
-
如果您使用的是 f-strings,请确保您使用的是支持 f-strings 的 Python 版本。那是 3.6 或更高。
-
感谢@Aesin!我在脚本中有一些使用 f 字符串的其他命令正在运行,所以我觉得很好
-
您需要使用
awk,还是欢迎其他解决方案? -
当然欢迎其他解决方案,只要我可以包含在脚本中 :)
-
@christinam 甚至认为这是一个 Swift 包清单,你必须在 Python 中这样做吗?
标签: python python-3.x awk insert