Bash:使用sed和Regular表达式的字符串操作不起作用:用斜杠替换字符串

时间:2018-06-07 08:04:01

标签: regex sed

我希望你能帮助我:

以下是我必须进行字符串操作的一行:

./period/0.0.1/projectname/path/path/-rw-rw-r--filename.txt 2462

最后一个数字是文件大小,以后需要计算。

序列-rw-rw-r--来自列出输出的文件,其中我将文件与目录分开,并跳过以" d"开头的所有行。 现在我需要摆脱行中的权利序列。

这是我的正则表达式,它正好击中目标:[/][-][-rwx]{9,9} 我用正则表达式检查器检查了它,并得到我想要的确切内容: 字符串/ - 包括以下9个字符。

我想要的是:替换此字符串" / - 包括以下9个字符"用一个斜杠/。 为避免转义,我在sed中使用管道作为分隔符。以下sed命令正常工作:

sed 's|teststring|/|g' inputfile > outputfile

问题:

当我更换" teststring"我的正则表达式并没有操纵任何东西:

sed 's|[/][-][-rwx]{9,9}|/|g' inputfile > outputfile

我根本没有错误,但在结果输出文件中没有字符串操作。

我在这里做错了什么?

请帮忙!

3 个答案:

答案 0 :(得分:2)

您可以将此sed与扩展的正则表达式一起使用:

sed -E 's|/-[-rwx]{9}|/|g' file

./period/0.0.1/projectname/path/path/filename.txt 2462
  • 无需在正则表达式中使用[/][-]
  • 使用-E进行扩展正则表达式匹配
  • .{9,9}.{9}
  • 相同

答案 1 :(得分:2)

您可以使用

sed 's|/-[-rwx]\{9\}|/|g'

请注意,在POSIX BRE模式中,为了指定限制量词,您需要转义大括号。

请参阅Bash demo

s='./period/0.0.1/projectname/path/path/-rw-rw-r--filename.txt 2462'
echo $s | sed 's|/-[-rwx]\{9\}|/|g'

输出:

./period/0.0.1/projectname/path/path/filename.txt 2462

注意:用括号表达式包装每个字符不是一个好主意,[/] = /[-] = {{1} }。

答案 2 :(得分:1)

sed默认使用BRE正则表达式,其中大括号应该被转义。

要么逃脱它们:

sed 's|[/][-][-rwx]\{9,9\}|/|g' inputfile > outputfile

或切换到ERE:

sed -n 's|[/][-][-rwx]{9,9}|/|g' inputfile > outputfile # for GNU sed
sed -E 's|[/][-][-rwx]{9,9}|/|g' inputfile > outputfile # for BSD sed & modern GNU sed

作为旁注,您的正则表达式可以简化为/-[-rwx]{9}

sed -E 's|/-[-rwx]{9}|/|g' inputfile > outputfile