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

Sed 一种将模式前每行的开头附加到同一行末尾的方法?,sed,Sed,我试图将文本文件中每一行的开头,在某个字符之前复制到同一行的结尾 我试着将每一行复制到它的末尾,然后删除字符后面的所有内容,但问题是我无法想出如何跳过字符的第一个实例,因此结果是重复的文本以及字符第一个实例之外的所有内容都被删除 我试过这样的方法 sed '/S/ s/$/ append text/' sample.txt > cleaned.txt 但这只会添加一个固定的文本。我还尝试使用: s/\(.*\)/\1 \1/ 复制行,然后删除S之后的所有内容,但我不知道如何让它转到第三

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

我试着将每一行复制到它的末尾,然后删除字符后面的所有内容,但问题是我无法想出如何跳过字符的第一个实例,因此结果是重复的文本以及字符第一个实例之外的所有内容都被删除

我试过这样的方法

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 's/\([^S]*\)S.*/& \1/' file

详细信息

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

您可以尝试:

awk '{print $0 " " substr($0, 0, index($0,"S") - 1)}' file
我们从第一个字符到但不包括第一个出现的“S”的子字符串。

OP说“在第一个S之前的所有内容都复制到行的末尾”。您的答案复制了最后一个S之前的所有内容。