获取上一行的第一个字符

Get first character of previous line

用上一行的第一个字符替换当前行的第一个字符。 例如输入文件:

Mark was
Great friend
And

输出文件:

Mark was
Mreat friend
Gnd

必须用 sed

完成

我不明白如何让字母准确地替换上一行单词的开头,我所能做的就是在行尾添加一个字符,而不是在开头:

sed '2,$ s/[^.]/& &/; 2,$ s/ /\n/' file.txt | paste -d ' ' - -

输出:

Mark was G
Great friend A
And

我不明白如何在正则表达式中指定在上一行的开头工作。

sed 肯定是错误的工具!但这似乎可以满足您的要求:

sed -e 1's/./&&/' -e H -e 's/\(.\).*//' -e x -e 's/\n.//' input

在第一行中,您复制了第一个字符以启动保留 space。对于所有行,您将行附加到保留 space (对于第一行,这是修改后的行,第一个字符被复制)。然后删除除第一个字符以外的所有字符,并将模式 space 与保留 space 交换。然后删除换行符和该行的第一个字符,将上一行的第一个字符和该行的其余部分保留在模式 space 中,而只有第一个字符保留 space .打印模式 space 并重复。

使用您显示的示例,请尝试遵循 awk 代码。简单的解释是,如果行号大于 1,则打印 prev(具有上一行的第一个字符)作为第一个字符,然后打印其余行。并将每行的第一个字符设置为 prev 变量,使其成为下一行的第一个字符。

awk '
FNR==1{ print }
FNR>1 {
  print prev substr([=10=],2)
}
{
  prev=substr([=10=],1,1)
}
' Input_file

更准确地说:

awk '
FNR>1 {
  [=11=] = prev substr([=11=],2)
}
{
  prev=substr([=11=],1,1)
}
1
' Input_file

这可能适合您 (GNU sed):

sed -E '1h;x;G;s/(.).*\n.//' file

保存第一行。

切换到复制的行,将当前行附加到它,删除复制的第一个字符到当前行的第二个字符之间的所有内容并打印它。

N.B。当前行现在变成一个副本,并且该过程重复到文件末尾。


如果每行总是以一个长度为 2 或更多的单词开头:

 sed -E '1h;x;G;s/\B.*\n.//' file