【问题标题】:Deleting extra spaces with sed使用 sed 删除多余的空格
【发布时间】:2014-09-24 19:44:00
【问题描述】:

我有一个看起来像这样的函数:

myfunc("arg1", "arg2", "arg3" );

注意末尾的多余空格。我正在尝试使用 sed 删除多余的空间。现在,我只是用echo 对其进行测试,而不是在真实文件上进行测试。我的命令是

echo 'myfunc("arg1", "arg2", "arg3" );' | sed 's/myfunc\(.* \);/myfunc\(.*\);/g'

但是当我运行它时,它只是输出原始文本,没有任何变化(包括额外的空间)。

【问题讨论】:

    标签: sed


    【解决方案1】:

    你可以试试下面的 sed 命令,

    $ echo 'myfunc("arg1", "arg2", "arg3" );' | sed 's/^\(.*\) /\1/g'
    myfunc("arg1", "arg2", "arg3");
    

    说明:

    • ^\(.*\) 捕获从开始到最后一个空格字符的所有字符。(不包括最后一个空格字符)。 (我在模式中包含了空格字符,但它无法显示。
    • 在替换部分,所有匹配的字符都被第一个捕获的组中的字符替换。

    $ echo 'myfunc("arg1", "arg2", "arg3"  );' | sed -E 's/(myfunc\(.*[^ ]) +(\))/\1\2/g'
    myfunc("arg1", "arg2", "arg3");
    

    【讨论】:

    • 你能解释一下这是如何获得空间的吗?它有效,但我不明白如何。看起来好像您没有在寻找任何额外的空格,因为右括号在星号之后。
    • 这段代码删除了给定行中的最后一个空格,不管它在哪里,对吧?例如。 fun("a", "b", "c") -> fun("a", "b","c")fun("a", "b", "c" ) ; -> fun("a", "b", "c" );
    • @Kent 我根据操作员的输入发布了。
    • 感谢您更新您的描述 - 我开始明白这一点。我稍微编辑了您的答案以使用扩展的 RE 并使其可以捕获所有额外的空格,并且仅在括号中的部分中。随时将其添加到您的答案中:echo 'myfunc("arg1", "arg2", "arg3" );' | sed -E 's/(.*[^ ]) +(.*)/\1\2/g'
    • 糟糕 - 稍作改动即可使其在更通用的环境中工作:sed -E 's/(myfunc\(.*[^ ]) +(\))/\1\2/g' 这样它实际上可以用于文件。否则,它会拾取各种空格并尝试删除它们。再次感谢您的帮助。
    【解决方案2】:

    这应该可以工作:

    echo 'myfunc("arg1", "arg2", "arg3" );' | sed -e 's/[[:space:]]\{1,\})/)/'
    

    它删除右括号前的一个或多个空格。我不确定您使用的是什么版本的 sed,但这应该适用于其中任何一个版本。

    输出:

    myfunc("arg1", "arg2", "arg3");
    

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 2012-01-24
      • 2019-03-03
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      相关资源
      最近更新 更多