Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带变量的Sed是';I don’我不想让它按我所希望的方式工作_Python_Variables_Sed - Fatal编程技术网

Python 带变量的Sed是';I don’我不想让它按我所希望的方式工作

Python 带变量的Sed是';I don’我不想让它按我所希望的方式工作,python,variables,sed,Python,Variables,Sed,这给了我一个错误 ExecutionError:sed:-e表达式#1,字符0:没有以前的正则表达式 我不确定是什么问题 上述内容正在Python脚本中使用。将其更改为: ('cd /etc/squid/ && new_val=9 && old_val=3 && sed -i "s/$old_val/$new_val/g" *.conf') 变量赋值需要是一个独立于sed的语句。将变量赋值放在语句开头时,它只设置由子进程继承的环境变量。但是您需要

这给了我一个错误

ExecutionError:sed:-e表达式#1,字符0:没有以前的正则表达式

我不确定是什么问题

上述内容正在Python脚本中使用。

将其更改为:

('cd /etc/squid/ && new_val=9 && old_val=3 && sed -i "s/$old_val/$new_val/g" *.conf')

变量赋值需要是一个独立于
sed
的语句。将变量赋值放在语句开头时,它只设置由子进程继承的环境变量。但是您需要通过原始shell扩展变量,因此您需要在执行
sed
命令之前设置变量。

实际上我发现了一些有效的方法,将每个变量放在单引号中并转义单引号。

您的问题是:

('cd /etc/squid/ && new_val=9 && old_val=3 && sed -i "s/$old_val/$new_val/g" *.conf')
依赖shell来扩展变量,而不是
sed
。但是,通过命令前缀设置变量只会影响命令的环境,而不会影响bash,因此
old_val
永远不会为字符串插值而定义。根据(增加的重点):

任何简单命令或函数的环境都可以通过在其前面加上参数赋值来临时扩充,如Shell参数中所述。这些赋值语句只影响该命令所看到的环境

因此,如果
sed
试图从自己的环境中读取
old_val
,它将看到正确的值。但是
sed
接收的是传递的后插值字符串,它是
s//9/g
,因为bash插值没有看到
old_val
(只存在于
sed

要修复此问题,请通过将赋值作为单独的命令而不是
sed
前缀来在bash中设置变量:

old_val=3 sed "s/$old_val/$new_val/g"
或者更正确地说,您应该真正避免依赖于
shell=True
(这很危险/很容易被误用)。即使您必须使用
sed
,您使用shell的所有内容都可以在Python层完成:

('cd /etc/squid/ && new_val=9 && old_val=3 && sed -i "s/$old_val/$new_val/g" *.conf')
这具有相同的行为(在
/etc/squid
中操作,并传递非限定的文件名,这样,如果深度嵌套的目录中有大量文件,就不会出现新的命令行长度问题)


当然,您可以更进一步,也可以使用Python来完成
sed
的工作;它的特点是在适当的位置编辑文件,就像
sed
(虽然如果文件的大小有意义,它可能会稍微慢一点)。

我知道我可以使用子流程,但我想知道我在这里缺少了什么。从命令行可以很好地工作。我怀疑Python可能是这里的问题。@miken32:这不是Python,是滥用了
bash
。从命令行看,它不能正常工作,简单的重新编译:
new\u val=9&&old\u val=3 sed“s/$old\u val/$new\u val/g”@ShadowRanger当我看到发送命令在单独的一行时,因此产生了混乱。我怀疑Python,因为他们说它正在Python脚本中使用,这意味着它必须有比我们看到的更多的上下文。你能解释/提供解决方案代码吗?我看不出单引号在这里有什么明显的帮助(您可以使用它们来避免bash变量插值,但我不认为
sed
会帮您,如果它接收到
$
名称,它只会将它们视为文字字符串)。
import os

# Get the (unqualified) names of all the entries with the desired name
files = [f for f in os.listdir('/etc/squid') if f.endswith('.conf')]
# Run w/o shell=True, in list form, letting Python handle the working directory
# and variable formatting
subprocess.Popen(['sed', '-i', 's/{}/{}/g'.format(old_val, new_val)] + files, cwd='/etc/squid')