【问题标题】:use sed to replace string with regular expression line by line使用 sed 将字符串逐行替换为正则表达式
【发布时间】:2013-02-21 01:24:59
【问题描述】:

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

但是对于如何做替换事情感到很困惑。请问有人可以帮忙吗?

【问题讨论】:

    标签: regex command-line sed


    【解决方案1】:

    试试这条线:

    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\3\2\3 ”是什么意思?这是否意味着列?
    • 他们的意思是团体。那些(...)s
    • 哦,我现在意识到了。非常感谢!
    【解决方案2】:

    你可以像这样使用 sed:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 2012-01-19
        • 2016-08-16
        • 2012-01-26
        • 1970-01-01
        • 2021-11-20
        相关资源
        最近更新 更多