一种将模式之前的每行开头附加到同一行末尾的方法?

时间:2019-10-02 18:04:38

标签: sed

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

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

我尝试过

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之前的所有内容复制到该行的末尾。

2 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见online demo

详细信息

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

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

答案 1 :(得分:0)

您可以尝试:

awk '{print $0 " " substr($0, 0, index($0,"S") - 1)}' file

我们从第一个字符开始直到但不包括“ S”的第一个出现的子字符串。