Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Regex 使用Sed正则表达式删除字符串_Regex_Unix_Sed - Fatal编程技术网

Regex 使用Sed正则表达式删除字符串

Regex 使用Sed正则表达式删除字符串,regex,unix,sed,Regex,Unix,Sed,我想在命令行上进行字符串替换。我可以在Python中完成这项工作,但如果我只在Unix中完成这项工作,我的工作流程会更容易。目前,我正在尝试使用sed 我正在尝试删除单引号包围的任何信息。在引号中,我有字母、数字、空格、破折号、方括号、下划线和分号的不同组合 这里有一个例子 (214016:0.13461,814430:0.04526)'o__stuff; f__[morestuff-123]':0.03063 在python中,我可以这样做 line = "(214016:0.13461,8

我想在命令行上进行字符串替换。我可以在Python中完成这项工作,但如果我只在Unix中完成这项工作,我的工作流程会更容易。目前,我正在尝试使用
sed

我正在尝试删除单引号包围的任何信息。在引号中,我有字母、数字、空格、破折号、方括号、下划线和分号的不同组合

这里有一个例子

(214016:0.13461,814430:0.04526)'o__stuff; f__[morestuff-123]':0.03063
在python中,我可以这样做

line = "(214016:0.13461,814430:0.04526)'o__stuff; f__[morestuff-123]':0.03063"
sub(r"\'[ \w;\-\[\]]+\'","",line)
正确地打印

(214016:0.13461,814430:0.04526):0.03063
我现在正尝试使用
sed
,这对我来说还不太合适。我一直在努力与你合作,这很有帮助。这是我得到的

sed "s/\'[-[:alnum:] ;\[\]]+\'//g" file.txt
这不管用。有什么想法吗


谢谢你的帮助

您需要将破折号放在正则表达式的第一个或最后一个;两个字符之间的破折号定义字符范围,即使其中一个字符是反斜杠

类似地,要匹配文字右方括号,请将其放在第一位(在任何否定或破折号之后)。在传统的正则表达式中,反斜杠只是字符范围内的文字反斜杠,您可以通过将任何特殊字符(破折号、方括号)放在第一位或最后来消除歧义

哦,失去你的爱

是否确实需要替换每行的多个引用?如果没有,则
/g
标志是多余的(但大部分是无害的)。

这可能对您有用(GNU-sed):

注意:表达式
'\'
是一个shell设备,用于表示单个
'

sed "s/'[^']*'//g" file

同样有效。

谢谢,修复了无效字符范围错误。我将从问题中删除这一部分。请不要改变问题,除非澄清它。也许这是一个边缘案件,但在这方面,Dar,仍然不起作用。是的,这是一条包含大约100个模式实例的单行线,因此/g很有用。关于编辑的适当说明。
sed“s/\'[-[A-Za-z0-9_;]*//g
有效,但是当我尝试添加方括号时失败了……等等,我不知道为什么,但是
sed“s/\'[-[A-Za-z0-9_;]*//g
去掉了方括号。所以这就是答案……正如我看到的,
[]
,不是吗?小问题:不要使用
cat file | sed…
!而是使用
sed…file
!这是真的,我要补充一点。但是,它仍然不起作用…谢谢你的帮助。谢谢波东,两者都很好用!我是新来的regex…我猜
[^']
指定了“匹配除单引号外的任何字符”,然后它是特定的,因为它正在查找由单引号包围的目标
sed 's/'\''[^'\'']*'\''//g' file
sed "s/'[^']*'//g" file