【问题标题】:How to add a character to specific lines using grep/awk/sed如何使用 grep/awk/sed 将字符添加到特定行
【发布时间】:2017-02-21 18:27:00
【问题描述】:

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

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

我想读一下:

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

【问题讨论】:

  • sed '/^@/s/$/\\1/' fileawk '/^@/{$0=$0"\\1"}1' file
  • 至少在sed中,反斜杠一有特殊的含义。它指的是第一次“编号保存”或“注册”或“反向引用”。如果您不定义一个,它将不知道该怎么做。尝试用另一个反斜杠转义反斜杠。

标签: bash awk sed grep


【解决方案1】:

在以@ 开头的每一行末尾添加\1sed 的基础。您只需指定一个与要修改的行匹配的正则表达式,您可以使用s 命令在您的尾部子中添加零长度行尾:

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

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

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

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

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

【讨论】:

  • 效果很好!谢谢!
【解决方案2】:

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

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

这很简单,如果是,则查找从 @ 开始的行,然后打印完整的行以及 "\1" 并执行下一步(意味着跳过所有其他提到的操作)。提到 1 的意思是:在 awk 中,它在条件然后动作方法上起作用,所以我在这里放 1 使条件为 TRUE 并且在这里没有提到肌动蛋白,因此默认情况下会打印当前行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多