放入bash脚本时sed行为不同

时间:2014-11-04 19:10:04

标签: linux bash sed cygwin

我有一堆python源文件,我正在转换为3.4语法。如果我使用以下命令:sed -r 's/^print\s(.+$)/print\(\1\)/g' 1.12.py > 1.12a.py 在Cygwin中,它会将所需的括号添加到打印命令,以便在语法上对3.x python正确。但是,当我尝试将其放入bash脚本中时:

#!/bin/bash

# This is a program to remove "from Tkinter import *" occurances from source code
# and to replace it with "from tkinter import *" so it will work in python 3.3, which
# is what I'm using to program the GUI in

sed -i 's/from\ Tkinter/from\ tkinter/g' *.py

# this line is supposed to add parentheses to all print statements since python 2.7 did not 
# require parentheses around print statements
for pyFiles in *.py
    do
        newPref=${pyFiles%.py}
        #echo $pyFiles
        newName="${newPref}a.py"
        sed -r 's/^print\s(.+$)/print\(\1\)/g' $pyFiles > $newName
    done

出于某种原因,这会创建所有文件的"" a.py版本,但它不会添加 打印语句的括号,就像我直接执行sed命令时一样。我可能错过了一些明显的东西。任何帮助将非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

将sed命令更改为

sed -r 's/print\s(.+$)/print\(\1\)/g' $pyFiles > $newName

将替换来源

中的每个print
  • 中的错误

sed -r 's/^print\s(.+$)/print\(\1\)/g' $pyFiles > $newName

^将正则表达式固定在字符串的开头。也就是说,只有当打印出现在行的开头时才匹配。由于python跟随缩进,它可能不总是从行的开头开始而是由制表符\t

表示。