繁体   English   中英

sed 对于包含字符串的特定行

[英]sed for specific line which contains a string

我有一个文件,例如

READS2b=/path1/path2/data/a_ACTTGA_L002_R2.fastq.gz.1
READS2b=/path1/path2/data/a_ACTTGA_L004_R2.fastq.gz.1
READS2b=/path1/path2/data/a_ACTTGA_L004_R2.fastq.gz

我只想将/path1/path2/data/更改为/path4/path5/data/包含.fastq.gz.1的行。

在这里我应该得到:

READS2b=/path4/path5/data/a_ACTTGA_L002_R2.fastq.gz.1
READS2b=/path4/path5/data/a_ACTTGA_L004_R2.fastq.gz.1
READS2b=/path1/path2/data/a_ACTTGA_L004_R2.fastq.gz

我会用:

sed 's@/path1/path2/@path4/path5/@g' file.txt

但我不知道如何只针对.fastq.gz.1

您可以使用

sed '/\.fastq\.gz\.1$/s@/path1/path2/data/@path4/path5/data/@g' file.txt

查看sed演示

这里,

  • /\.fastq\.gz\.1$/查找以.fastq.gz.1结尾的行
  • s@/path1/path2/data@path4/path5/data/@g仅在这些行上将/path1/path2/data/替换为path4/path5/data/

这可能对你有用(GNU sed):

sed '/\.fastq\.gz\.1/s#/path1/path2\(/data/\)/path4/path5\1#' file

关注包含.fastq.gz.1的行并在模式匹配时替换。

如果您对awk ,请尝试以下操作。 awk解决方案中,我提出了 2 个名为currTextnewText的变量,它们的名称本身是自解释的,可以在这些变量中放置文本,我们可以在具有.fastq.gz.1的行中用 newText 全局替换 currText 值在里面。

awk -v currText="/path1/path2/data/" -v newText="/path4/path5/data/" '
/\.fastq\.gz\.1/{
  gsub(currText,newText)
}
1
' Input_file

使用 GNU awk

awk '/fastq.gz.1/ {gsub(/path1/,"path4") gsub(/path2/, "path5")}'1 file
READS2b=/path4/path5/data/a_ACTTGA_L002_R2.fastq.gz.1
READS2b=/path4/path5/data/a_ACTTGA_L004_R2.fastq.gz.1
READS2b=/path1/path2/data/a_ACTTGA_L004_R2.fastq.gz

这个代码:

  • 首先是条件。 只有这些记录: /fastq.gz.1/ ,不是全部。
  • 其次是动作,在本例中是用gsub替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM