2

我试图对一个 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

但是对于如何做更换事情感到很挣扎。有人可以帮忙吗?

4

3 回答 3

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;
于 2013-03-06T10:10:04.333 回答
0

您可以将 sed 与以下内容一起使用:

s/(name:\{id:)[^,]*,(.*)(alias: )([^;]*)/\1\4,\2\3\4/g
于 2013-03-06T10:10:55.930 回答
0

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

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

于 2013-03-06T10:11:00.460 回答