使用sed通过使用正则表达式捕获组替换文件中的字符串

时间:2014-12-29 14:11:43

标签: regex bash sed

我首先说我是shell脚本的新手,所以请不要开枪! :)

我有一个包含以下文字的文件:

1   :    / 
2   :    /string-1/ 
4   :    /string-2/ 
5   :    /string-3/

我喜欢删除字符串的结束斜杠,所以结果应该是这样的:

1   :    / 
2   :    string-1 
4   :    string-2 
5   :    string-3

我已尝试使用sed,如下所示:

local_export_folder="/home/merianos/Documents/repositories/DatabaseBackup/tmp"

sed -i -e 's/\/([^\/]+)\//\1/' ${local_export_folder}/blogs.csv

但这不起作用。

我做错了吗?

1 个答案:

答案 0 :(得分:3)

这对我有用:

sed 's#/\([^/]*\)/#\1#' file

这会捕获两个正斜杠之间的任何内容。替换是内容,没有斜线。

您可能遇到的一个问题是所有版本的sed都无法理解+(一个或多个)。我已将其更改为*(表示零或更多),这是更广泛认可的。如果您愿意,可以使用符合POSIX的\{1,\}来表示一个或多个

输出:

$ sed 's#/\([^/]*\)/#\1#' file
1   :    /
2   :    string-1
4   :    string-2
5   :    string-3

根据您的sed版本,您可以使用-r-E开关启用扩展正则表达式。这意味着括号不需要转义就可以用作捕获组,并且+被理解为:

sed -r 's#/([^/]+)/#\1#' file