如何使用sed进行多行替换?

时间:2018-01-13 14:26:50

标签: linux sed

我有一个名为" a6s"的文本文件。像这样的多行:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>this is a paragraph creted to demonstrate highlighting selected text</p>
<script>
$(document).ready(function(){

$("p").on("mouseup",function() {
    oldtxt = chosenText();
    
        var newtxt = '<span  style="color:red;">' + oldtxt +'</span>';
$(this).html($(this).html().replace(oldtxt,newtxt));
    
});

//Grab selected text
function chosenText(){
    if(window.getSelection){
        return window.getSelection().toString();
    }
    else if(document.getSelection){
        return document.getSelection();
    }
    else if(document.selection){
        return document.selection.createRange().text;
    }
}
});
</script>

我用过这个脚本:

y
n
yyy
n
y
yyy
yy
y
yyy
n

我想插入两个&#34; y&#34;最后一行结尾的chars和输出的下一行的开头:

$ sed -i "s/y$^y/ya\ny/g" a6s;

3 个答案:

答案 0 :(得分:2)

使用GNU sed(这个出色的解决方案完全归功于@Sundeep,谢谢):

sed

要使用N处理多行,您必须使用PD{cmds}命令:

  • /y$/ {cmds}:命令组
  • y:仅当行以N
  • 结尾时才执行命令组
  • s/regex/replacement/:读取模式空间的下一行
  • g:替换,不需要P标志
  • \n:将模式空间打印到第一个D字符(第一行)
  • \n:删除第一个sed -i ':a; N; s/y\ny/ya\ny/; {P; D}; ba' a6s 字符
  • 之前的模式空间

我使用不必要标签的原始解决方案:

{{1}}

我建议您查看有关使用多行的精彩grymoire.com教程。

答案 1 :(得分:1)

sed用于单个行上的简单替换,即全部。当你试图用它做任何其他事情时,你使用的是在20世纪80年代中期发明awk时变得多余的奥术符文。使用GNU awk进行多字符RS:

$ awk -v RS='^$' -v ORS= '{while(sub(/y\ny/,"ya\ny"));} 1' file
y
n
yyy
n
ya
yyya
yya
ya
yyy
n

以上简单地说明了这一点 - 循环输入用y\ny替换每个ya\ny,同时有y\ny替换。

答案 2 :(得分:0)

将输入文件转换为行不是一个简单的解决方案:您需要对文件进行两次处理:

root: {
  display: 'flex',
  flex-direction: column;
},