修改了行sed / awk的副本

时间:2014-02-01 00:29:21

标签: bash sed awk

我试图在原始行之后插入修改后的行副本。

这是我的档案:

random
N:John Doe
random
N:Jane Roe
random
random
N:Name Sirname
random

这是我的文件需要的样子:

random
N:John Doe
FN:John Doe
random
N:Jane Roe
FN:Jane Roe
random
random
N:Name Sirname
FN:Name Sirname
random

对于这个的任何想法?似乎无法找到合适的sed / awk组合......

4 个答案:

答案 0 :(得分:4)

sed -n ' p; s/^N:/FN:/p' original.txt

这会产生:

random
N:John Doe
FN:John Doe
random
N:Jane Roe
FN:Jane Roe
random
random
N:Name Sirname
FN:Name Sirname
random

它的工作原理如下。我们调用sed -n这意味着,默认情况下,它不会打印任何行。然后,我们给它两个命令。第一个是p,用于打印现有的未修改的行。第二个s/^N:/FN:/p告诉它尝试将FN:替换为任何前导N:,如果该替换成功(意味着该行实际上以N:开头),然后打印修改后的版本。

答案 1 :(得分:2)

您应该可以使用以下内容执行此操作:

sed -e 's/^\(N:.*\)$/\1\nF\1/g' yourfile.txt

这使用正则表达式来查找以字符序列“N:”开头的文件。当它找到它时,它会用\1\nF\1替换该行(原始行,加上换行符加上大写'F',再加上原始行)。

这一切都假设“随机”行不会以“N:”开头。

答案 2 :(得分:2)

使用&符号插入匹配副本

<&amp;&符号会将左手边的完整匹配副本插入到sed表达式的右侧。因此,使用简单的替换来在匹配副本之间放置换行符和前导F就是所需要的。例如:

$ sed 's/^N:.*/&\nF&/' /tmp/corpus.txt 
random
N:John Doe
FN:John Doe
random
N:Jane Roe
FN:Jane Roe
random
random
N:Name Sirname
FN:Name Sirname
random

答案 3 :(得分:1)

以下是awk解决方案:

awk '/N:/{print $0"\nF"$0;next}1' file

$ cat file
random
N:John Doe
random
N:Jane Roe
random
random
N:Name Sirname
random

$ awk '/N:/{print $0"\nF"$0;next}1' file
random
N:John Doe
FN:John Doe
random
N:Jane Roe
FN:Jane Roe
random
random
N:Name Sirname
FN:Name Sirname
random