首页 > 解决方案 > 一种将模式之前的每一行的开头附加到每一行的末尾的方法?

问题描述

我正在尝试将某个字符之前的文本文件中每一行的开头复制到同一行的末尾。

我尝试将每一行复制到自身的末尾,然后删除字符之后的所有内容,但问题是我无法弄清楚如何跳过字符的第一个实例,所以结果是重复的文本以及字符第一个实例之外的所有内容都被删除。

我试过像

sed '/S/ s/$/ append text/' sample.txt > cleaned.txt

但这只会添加固定文本。我也尝试过使用:

s/\(.*\)/\1 \1/

复制该行,然后删除之后的所有内容S,但我不知道如何让它去第三S而不是第一开始删除。

我必须开始:

dog 50_50_S5_Scale
cat 10_RV_S76_Scale
mouse 15_SQ_S81_Scale

我想要得到什么:

dog 50_50_S5_Scale dog 50_50_
cat 10_RV_17_S76_Scale cat 10_RV_17_
mouse 15_EQ_S81_Scale mouse 15_EQ_

第一个之前的所有内容都S被复制到行尾。

标签: sed

解决方案


您可以使用

sed 's/\([^S]*\)S.*/& \1/' file

查看在线演示

细节

  • \([^S]*\)- 捕获组 1 ( \1):除此之外的任何 0+ 个字符S
  • S.*-S和字符串的其余部分(实际上是行,因为sed默认情况下逐行处理)。

替换是整个匹配 ( &)、空格和第 1 组值的串联。


推荐阅读