Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
使用sed通过使用regex捕获组替换文件中的字符串_Regex_Bash_Sed - Fatal编程技术网

使用sed通过使用regex捕获组替换文件中的字符串

使用sed通过使用regex捕获组替换文件中的字符串,regex,bash,sed,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_folde

我首先说我对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
但这不起作用

我做错什么了吗?

这对我很有用:

sed 's#/\([^/]*\)/#\1#' file
这将捕获两个正斜杠之间的任何内容。替换为内容,没有斜杠

您可能一直面临的一个问题是,+一个或多个并不是所有版本的sed都能理解的。我把它改成了a*,意思是零或更多,这一点得到了更广泛的认可。如果愿意,可以使用POSIX兼容\{1,\}来表示一个或多个

输出:

$ sed 's#/\([^/]*\)/#\1#' file
1   :    /
2   :    string-1
4   :    string-2
5   :    string-3
根据您的sed版本,您可以使用-r或-E开关启用扩展正则表达式。这意味着括号不需要转义就可以用作捕获组,并且+可以理解为:

sed -r 's#/([^/]+)/#\1#' file
这对我很有用:

sed 's#/\([^/]*\)/#\1#' file
这将捕获两个正斜杠之间的任何内容。替换为内容,没有斜杠

您可能一直面临的一个问题是,+一个或多个并不是所有版本的sed都能理解的。我把它改成了a*,意思是零或更多,这一点得到了更广泛的认可。如果愿意,可以使用POSIX兼容\{1,\}来表示一个或多个

输出:

$ sed 's#/\([^/]*\)/#\1#' file
1   :    /
2   :    string-1
4   :    string-2
5   :    string-3
根据您的sed版本,您可以使用-r或-E开关启用扩展正则表达式。这意味着括号不需要转义就可以用作捕获组,并且+可以理解为:

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

你的标题有误导性,这里没有“正则表达式变量”。你能比“这不起作用”更具体一点吗?我试图描述的标题是如何使用括号的内容作为替换文本。我不知道如何更好地写这个标题。括号之间的部分称为捕获组。希望能有帮助。谢谢!!:这真的是帮助;你的标题有误导性,这里没有“正则表达式变量”。你能比“这不起作用”更具体一点吗?我试图描述的标题是如何使用括号的内容作为替换文本。我不知道如何更好地写这个标题。括号之间的部分称为捕获组。希望能有帮助。谢谢!!:这真的是帮助;谢谢,当我使用我的正则表达式时,你终于帮了我很多,因为我看到你也逃脱了捕获组的括号。因此,当我转义时,括号也适用于我。如果这有帮助,要破坏性地更改输入,请使用:sed-I的/[^/]*/\1'file@Merianos我提到了一种使用括号而不必转义的方法。谢谢,当我使用正则表达式时,最后你帮了我很多,因为我看到你也逃脱了捕获组的括号。因此,当我转义时,括号也适用于我。如果这有帮助,要破坏性地更改输入,请使用:sed-I的/[^/]*/\1'file@Merianos我提到了一种使用括号而不必转义的方法。