【问题标题】:How to find and replace the last space in each line of a file in BASH?如何在 BASH 中查找和替换文件每一行中的最后一个空格?
【发布时间】:2015-01-28 07:13:01
【问题描述】:

我有一个这样的文件:

Once upon a time there lived a cat.
The cat lived in the forest.
The forest had many trees.

我需要将每行的最后一个空格替换为“@”,例如:

Once upon a time there lived a@cat.
The cat lived in the@forest.
The forest had many@trees.

我尝试了sed 's/ .*$/@/g' file.txt,但.* 匹配所有内容并删除在那里找到的所有文本。

如何将每行的最后一个空格替换为“@”?

【问题讨论】:

  • 哈哈,解决这个小问题的方法很多。你看,正则表达式给了我们太多的选择:)

标签: regex bash replace sed


【解决方案1】:

试试

s/\s([^\s]*)$/@\1/g

祝你好运, 鲍勃

编辑: 大声笑,测试它,似乎做你想做的事:)

my $s = "the quick brown fox jumped";
$s =~ s/\s([^\s]*)$/@\1/g;
print $s;
# prints the quick brown fox@jumped

【讨论】:

    【解决方案2】:

    匹配最后一个空格的正则表达式是(?=\S+$),不确定如何将sed切换到PCRE模式(以支持前瞻):

    perl -ple "s/ (?=\S+$)/@/" file.txt
    

    【讨论】:

      【解决方案3】:

      我通常为此使用 Perl:

      perl -ple 's/ ([^ ]+)$/@\1/' file.txt
      

      【讨论】:

        【解决方案4】:

        试试这个:

        sed 's/\(.*\) /\1@/'
        

        【讨论】:

        • 如果你不喜欢转义括号,你可以这样做:sed -r 's/(.*) /\1@/'
        • 为什么保证只替换最后一个空格?即为什么\(.*\) 与包含其他空格的最长可能字符串匹配?
        • @cmo 因为* 运算符正在贪婪地匹配。这意味着它被定义(和实现)以尽可能匹配(即不让整个表达式失败)。如果您将? 运算符附加到*,则该运算符不再是贪婪的。 . 运算符匹配 任何 字符,包括空格。
        • 这是一个非常重要的属性;一个我没有完全欣赏的更微妙的功能。谢谢!
        • 这太棒了。非常感谢!
        猜你喜欢
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 2021-04-27
        • 2019-07-26
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        相关资源
        最近更新 更多