用sed替换路径

时间:2010-03-07 10:07:34

标签: regex sed replace

如何使用sed替换此行

char * path_list_[1] = { "/some/random/path" };

这一行

char * path_list_[2] = { "lib/foo", "lib/bar" };

在名为source.c的文件中

注意:
*路径非常随机 *您的解决方案只应在source.c中更改此行 *我只对sed oneliner感兴趣。

您可以使用此Python正则表达式作为起点:

text = re.sub('static const char \* path_list_\[1\] = \{ "[^"]*" \};', 
    'static const char * path_list_[2] = { "lib/sun", "lib/matlab" };', text)

7 个答案:

答案 0 :(得分:1)

试试这个:

sed -e 's/=\s*{\s*"[^"]*"\s*};/= { "lib\/foo", "lib\/bar"};/' source.c | sed -e 's/path_list_\[1\]/path_list_[2]/'

答案 1 :(得分:1)

首先,找到一个不会出现在你的路径或替代品中的角色(通​​常#是一个很好的初步近似值,但是......)。

然后:

sed 's#_.1. = {[^}]*}#_[2] = { "your/first", "and/your/second" }#'

请注意,s之后的第一个字符是您的分隔符,不需要它/,它只是传统上“我不需要的字符”。

编辑:好像sed不理解+为“一个或多个”。请改用*(零或更多)。

答案 2 :(得分:1)

$ cat file
aaaa
char * path_list_[1] = { "/some/random/path" };
zzzz

$ sed '/char/s@1\]@2]@;s@{.*}.*$@{\"lib\/foo", "lib\/bar"}@' file
aaaa
char * path_list_[2] = {"lib/foo", "lib/bar"}
zzzz

答案 3 :(得分:1)

假设您要替换名为 path_list _ 的字符串变量,并且只替换那些字符串变量。

sed '/path_list_/s@1\]@2]@; /path_list_.*\[.*{/s@\".*\"@\"lib\/foo", "lib\/bar"@'

这将仅替换以下输入中的前两行。

char * path_list_[1] = { "/some/random/path" };
char * path_list_[1] = {"/some/random/path"};
char * not_replaced[1] = { "/some/random/path" };
char * not_replaced[1] = {"/some/random/path"};
char * path_list_ = {"/some/random/path"};
path_list_[1] = "/some/random/path";

答案 4 :(得分:1)

基于您给出的Python正则表达式:

echo 'char * path_list_[1] = { "/some/random/path" };' | \
    sed -E -e 's/char \* path_list_\[1\] = \{ "[^"]*" \};/char * path_list_[2] = { "lib\/sun", "lib\/matlab" };/'

输出

char * path_list_[2] = { "lib/sun", "lib/matlab" };

或者

echo 'static const char * path_list_[1] = { "/some/random/path" };' | \
    sed -E -e 's/static const char \* path_list_\[1\] = \{ "[^"]*" \};/static const char * path_list_[2] = { "lib\/sun", "lib\/matlab" };/'

输出

static const char * path_list_[2] = { "lib/sun", "lib/matlab" };

(这是使用Mac OS X中包含的FreeBSD-type sed完成的。)

答案 5 :(得分:0)

sed -e 's@char \* path_list_\[1\] = { "[^"]*" };@char * path_list_[2] = { "lib/foo", "lib/bar" };@g'

答案 6 :(得分:0)

sed -re 's/^(char \* path_list_\[)1(\] = \{ ")[^"]*(" \})\W*$/\12\2\/lib\/foo", "\/lib\/bar\3/' source.c