如何替换文本特定字符并在其上方行首插入指定字符
问题描述
我有个文本文件,里面有不少内容相近的行,需要完成两个操作:
- 把所有带
/的行里的/替换成- - 在做了替换的那一行的上一行开头加个
-
我试过这么写命令,但没达到预期:
cat text | sed "/\//s/^/- /g;s/\/ /\n- /g"
输入文件内容
1 00:00:00,000 --> 00:00:00,000 You are older. 2 00:00:00,000 --> 00:00:00,000 By length of a sunset. / Is older. 3 00:00:00,000 --> 00:00:00,000 Soona. 4 00:00:00,000 --> 00:00:00,000 Noa! / Noa, wait!
期望输出
1 00:00:00,000 --> 00:00:00,000 You are older. 2 00:00:00,000 --> 00:00:00,000 - By length of a sunset. - Is older. 3 00:00:00,000 --> 00:00:00,000 Soona. 4 00:00:00,000 --> 00:00:00,000 - Noa! - Noa, wait!
解决方案
你之前的命令没法处理“给上一行加-”的需求,因为sed默认逐行处理,没法直接回溯修改上一行。可以用sed的保持空间来临时存上一行内容,实现跨行修改。
用下面的命令就能搞定:
sed '/^\/ /{x;s/^/- /;x;s/^\/ /- /}' text
命令拆解
/^\/ /:精准匹配以/开头的目标行- 第一个
x:交换当前行(模式空间)和保持空间的内容——此时保持空间里存的是上一行,模式空间是当前的/ ...行 s/^/- /:给保持空间里的上一行开头加-- 第二个
x:再次交换,把改好的上一行放回模式空间,当前行回到保持空间 s/^\/ /- /:把当前行的/替换成-- 最后sed会自动输出修改后的两行
要是想直接修改原文件,加个-i参数就行:
sed -i '/^\/ /{x;s/^/- /;x;s/^\/ /- /}' text
内容的提问来源于stack exchange,提问作者kuninox
相关产品推荐
相关产品推荐

