如何解决如何安全地将带有大量引号的shell命令转义为Python字符串?
我有以下awk命令:
awk FPAT="([^,]+)|(\"[^\"]+\")" '{ print $7048 }' ...
我想使用os.system(cmd)
提交它,
但是我找不到用所有特殊字符在python字符串中编写代码的正确方法。
以下是我的最新尝试:
cmd = " awk -v FPAT=\"([^,]+)|(\\""[^\\""]+\\"")"" ' {{ print %s }} ' %s > %s" .format(c,input,output)
我得到以下结果:
' awk -v FPAT="([^,]+)|(\\[^\\]+\\) \' { print %s } \' %s > %s'
有人可以帮我吗?
解决方法
您正在将%
运算符使用的占位符与format
方法使用的字段说明符混淆。
cmd = "awk -v FPAT=\"([^,]+)|(\\""[^\\""]+\\"")"" ' {{ print {} }} ' {} > {}" .format(c,input,output)
此外,您应该使用subprocess
模块而不是os.system
。 Python可以处理输出重定向,因此您不需要外壳。
with open(output,"w") as f:
subprocess.run(["awk","-v",'FPAT=([^,]+)|("[^\\"]+")','{{ print {} }}'.format(c),input])
假设使用Python 3.6或更高版本,则可以使用f字符串文字简化awk
脚本。
with open(output,f'{{ print {c} }}',input])
,
您可以使用import { ApiService } from '../api.service';
import {ActionService} from '../action.service';
declare var module: {
id: string;
};
@Component({
selector: 'app-to-do-list',templateUrl: './to-do-list.component.html',styleUrls: ['./to-do-list.component.css']
})
export class ToDoListComponent implements OnInit,OnChanges{
@Input() message;
tasks: Task [];
filterd: Task [];
tsk: Task;
taskfield: string;
section: string;
remaining: number;
tas:Task;
acts:any;
idParti;
constructor(private actionService:ActionService) {
this.tasks = [];
this.taskfield = '';
this.section = '';
this.getAll();
}
ngOnInit(): void {
}
ngOnChanges(changes:SimpleChanges) {
if(this.message) {
this.idParti=this.message.id;
console.log("parti",this.idParti);
this.actionService.getActionsFromIdPart(this.idParti).subscribe((result)=>{console.log("result",result)
this.acts=result});
this.acts.forEach(element => {
console.log("action",element.nomaction) ;
this.tas={
text:element.nomaction,isCompleted:element.complete
};
this.tasks.push(this.tas);
});
}
}
addTask(val: any) {
if (val.length === 0) {
return;
}
this.tsk = {
text: val,isCompleted: false
};
this.tasks.push(this.tsk);
this.taskfield = '';
if (this.section === 'Completed') {
this.getCompleted();
} else if (this.section === 'Not Completed') {
this.getNotCompleted();
}
}
toggleCompleted(i){
this.tasks[i].isCompleted = !this.tasks[i].isCompleted;
}
deleteTask(i: any){
this.tasks.splice(i,1);
if (this.section === 'Completed') {
this.getCompleted();
} else if (this.section === 'Not Completed') {
this.getNotCompleted();
}
}
countRemaining() {
this.remaining = 0;
this.tasks.forEach(element => {
if (!element.isCompleted) {
this.remaining++;
}
});
return this.remaining;
}
getAll() {
this.filterd = this.tasks;
this.section = 'All';
}
getCompleted() {
this.filterd = this.tasks.filter(task => task.isCompleted);
this.section = 'Completed';
}
getNotCompleted() {
this.filterd = this.tasks.filter(task => !task.isCompleted);
this.section = 'Not Completed';
}
clearAll() {
this.tasks = [];
this.filterd = [];
}
}
interface Task {
text: string;
isCompleted: boolean;
}
方便地将文本转换为字符串,然后将其复制粘贴到源代码中:
input()
在Python 2中,请改用>>> cmd = input()
awk FPAT="([^,]+)|(\"[^\"]+\")" '{ print $7048 }' ...
>>> cmd
' awk FPAT="([^,]+)|(\\"[^\\"]+\\")" \'{ print $7048 }\' ...'
。
顺便说一句,请避免使用raw_input()
作为变量名,因为它shadows the builtin input
会导致此方法不起作用。
或者,如果文本不包含任何三引号,则可以使用三引号的原始字符串:
input()
在Charles Duffy中建议使用原始字符串选项的信用额为a comment。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。