如何使用grep / awk / sed将字符添加到特定行

时间:2017-02-21 18:27:00

标签: bash awk sed grep

我想搜索一个文件并将\ 1添加到以@开头的每一行的末尾。一个问题是grep并不喜欢" \ 1"。这是文件外观的几行:

<div class="container">


    <ul>
      <li><a href="#home">Home</a></li>
      <li><a href="#news">News</a></li>
      <li><a href="#contact">Contact</a></li>
    </ul>

    <div class="content">
        <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
        <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
        <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
    </div>
</div>

我希望阅读:

@SRR1248080.1 1 length=90
TCTCACTGGCTGACTGAAGGCATGTCTAGTATTCAGAGTTTGCTACGATTTGGTACCGCTTTCGCAGCCC
GCACCGAAACAGTGCTTTACCCCTAGACAGCTCATAGTCAACCGCTGCGCCTCAACGCATTTCGGGGAGA
ACCAGCTAGCTCCGAGTTCGATTGGTATTTCACCCCTAACCACAGCTCATCCGCTGATTTTTCAACATCA
@SRR1249238.1 1 length=173
GCACCGAAACAGTGCTTTACCCCTAGACAGCTCATAGTCAACCGCTGCGCCTCAACGCATTTCGGGGAGA
ACCAGCTAGCTCCGAGTTCGATTGGTATTTCACCCCTAACCACAGCTCATCCGCTGATTTTTCAACATCA

2 个答案:

答案 0 :(得分:3)

\1添加到以@开头的每一行的末尾是面包&amp; sed的黄油。您只需指定一个与要修改的行匹配的正则表达式,并且您可以使用s命令在尾部中为零行长的行结束:

sed '/^@/ s/$/\\1/' input_file

注意反斜杠加倍以抑制其对sed的特殊含义。

您可能希望跳过已经被子网划分的子线,可能是之前的运行。这也不难:只需匹配这些行并使用n命令输出它们而无需进一步处理:

sed '/\\1$/ n; /^@/ s/$/\\1/' input_file

请注意,sed脚本用单引号括起来,而不是双引号;它在这里有所不同(对于shell)。

答案 1 :(得分:1)

@aeli:尝试(如果您对awk解决方案感兴趣):

awk '/^@/{print $0"\\1";next} 1'  Input_file

很简单,找一条从@开始的行,如果是,则打印完整行和“\ 1”,然后执行下一步(表示跳过所有其他提到的操作)。提到1意味着:在awk中它在条件和动作方法上工作,所以我在这里放置1,这里条件为TRUE并且在这里没有提到actin因此默认打印当前行将会发生。