使用sed逐行替换正则表达式的字符串

时间:2013-03-06 10:03:42

标签: regex command-line sed

我尝试对clex文件进行一些操作,格式如下:

name:{id:xxx, ... ...} alias: aaa;
name:{id:yyy, ... ...} alias: bbb;
name:{id:zzz, ... ...} alias: ccc;

我需要做的是将名称后的内容替换为别名。所以结果应该是:

name:{id:aaa, ... ...} alias: aaa;
name:{id:bbb, ... ...} alias: bbb;
name:{id:ccc, ... ...} alias: ccc;

我可以使用sed来完成操作吗?我试图使用正则表达式但失败了。 然后我尝试使用for循环:

readarray lines < "$file"

for line in "${lines[@]}"; 
do
    ???
done

但是如何做替换的事情却很困难。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

试试这一行:

sed -r 's/(name:\{id:)[^,]*(.*alias: )([^;]*);/\1\3\2\3;/' file

使用您的示例数据:

kent$  echo "name:{id:xxx, ... ...} alias: aaa;
name:{id:yyy, ... ...} alias: bbb;
name:{id:zzz, ... ...} alias: ccc;"|sed -r 's/(name:\{id:)[^,]*(.*alias: )([^;]*);/\1\3\2\3;/'
name:{id:aaa, ... ...} alias: aaa;
name:{id:bbb, ... ...} alias: bbb;
name:{id:ccc, ... ...} alias: ccc;

答案 1 :(得分:0)

你可以使用这样的东西:

s/(name:\{id:)[^,]*,(.*)(alias: )([^;]*)/\1\4,\2\3\4/g

答案 2 :(得分:0)

sed 's/name:{id:[a-z],+(.*)alias: ([a_z]+)/name:{id:\2,\1/alias: \1/

我告诉你未经测试的,一些控制字符可能需要被转义。您可以调整[a-z]+以匹配您的别名匹配。