如何使用 sed 替换除最后一个符号之外的所有符号?

如何使用 sed 替换除最后一个符号之外的所有符号?

例如,我得到了这样的一行:

44567743346_567864_56788_5677_3

我想把所有的 都改成_:除了最后一个要改成\。预期输出是:

44567743346:567864:56788:5677\3

答案1

$ echo '44567743346_567864_56788_5677_3' | sed -r 's|_|:|g; s|:([^:]*)$|\\\1|'
44567743346:567864:56788:5677\3

这使用了两个 sed 替换命令。第一个命令s|_|:|g将所有下划线更改为冒号。第二个命令s|:([^:]*)$|\\\1|找到最后一个冒号并将其更改为反斜杠。

以这种方式修改文件的每四行

sed -r '1~4{s|_|:|g; s|:([^:]*)$|\\\1|;}' file

要就地修改文件:

sed -i -r '1~4{s|_|:|g; s|:([^:]*)$|\\\1|;}' file

答案2

如果您知道示例中最后一次出现的次数,_例如最后一次是行中的_第四次,您可以执行以下操作:_

sed 's/_/\\/4; s/_/:/g' file.txt

这里我们首先将第 4 次(最后一次)出现的 转换为_\然后将其余出现的_转换为:

例如 :

$ echo '44567743346_567864_56788_5677_3' | sed 's/_/\\/4; s/_/:/g'
44567743346:567864:56788:5677\3

另一方面,如果您不知道 最后一次出现的位置_,您可以贪婪地匹配到 最后一次出现的位置_,用 替换它\,然后用 替换其余部分:

sed -r 's/^(.*)_/\1\\/; s/_/:/g' file.txt

例如 :

$ echo '44567743346_567864_56788_5677_3' | sed -r 's/^(.*)_/\1\\/; s/_/:/g'
44567743346:567864:56788:5677\3

答案3

A简单一使用sed

echo "44567743346_567864_56788_5677_3" | rev | sed "s/_/:/2g" | sed 's/_/\\/' | rev


现在让我们看看怎么运行的:-

1) rev反转字符串,

它成为了3_7765_88765_468765_64334776544

2) sed "s/_/:/2g替换所有出现的 ,_除了:反转字符串中第一次出现的,

它成为了,3_7765:88765:468765:64334776544

3)接下来sediesed 's/_/\\/'仅替换第一次出现的_to \

它成为了,3\7765:88765:468765:64334776544

4) rev反转这个处理过的字符串

现在,最终的字符串是:-

44567743346:567864:56788:5677\3

现在,它的完毕

笔记:它没有提供太多的效率。它在这里只是因为它简单的

答案4

适用于任意长度的线路:

$ echo "44567743346_567864_56788_5677_3" | sed -E 's/^(.*)_/\1\\/; s/_/:/g'
44567743346:567864:56788:5677\3

相关内容