繁体   English   中英

用匹配模式替换行

[英]Replace Line with Matching Pattern

我有一个包含两行对联的文件,一个 header 行,以//开头并以|包围的行号结束 , 后跟一行长度可变的文本。 下面是一个示例,其中...表示文件以连续的行号连续多行。

// *  *   -  - - *  |1|
textextextextextextextext
// *- *-*       * |2|
textextextextextextextexttextextextext
...
// * - * -*                          |41232|
textextextextextextext

我想找到行号,然后用>linenumber替换 header 行。 这个示例文件是:

>1
textextextextextextextext
>2
textextextextextextextexttextextextext
...
>41232
textextextextextextext

我知道这可能涉及/ssedawk与反向引用,但我似乎无法让它工作。

sed单线:

sed 's%^//.*|\([0-9]*\)|$%>\1%' file

是的,sed 是一个很好的工具:

sed -E '\%^//.*\|[[:digit:]]+\|% s/.*\|([[:digit:]]+)\|/>\1/' 

解释:

  • \%^//.*\|[[:digit:]]+\|%这是一个地址,即后面s///命令只会在匹配的行上运行。 它在一行的开头匹配// ,在后面的某个地方,竖线之间必须有一个数字。
  • 替换用捕获的数字替换整行。

使用任何 awk:

$ awk -F'|' 'NF>1{$0=">" $2} 1' file
>1
textextextextextextextext
>2
textextextextextextextexttextextextext
...
>41232
textextextextextextext

以上假定text从不包含| 秒。

暂无
暂无

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

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