unix 用匹配图案替换行

ndh0cuux  于 2023-01-30  发布在  Unix
关注(0)|答案(3)|浏览(158)

我有一个包含两行对句的文件,标题行以//开始,以|包围的行号结束,后面是一行长度可变的文本。下面是一个例子,其中...表示文件以连续的行号继续许多行。

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

我想找到行号,然后将标题行替换为>linenumber

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

我知道这可能涉及到/ssedawk与反向引用,但我只是似乎不能使它工作。

olqngx59

olqngx591#

sed一行程序:

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

jjhzyzn02#

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

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

说明:

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

ny6fqffe3#

使用任意awk:

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

上面假设text从不包含| s。

相关问题