例如,我得到了这样的一行:
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)接下来sed
iesed '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