众所周知的SED命令,用于提取第一行并打印到另一个文件
sed -n '1 p' /p/raw.txt | cat >> /p/001.txt ;
在/p/001.txt中输出
John Doe
但是如何修改上面的命令来添加一些自由文本,例如,输出像
Name: John Doe
感谢任何提示尝试。
答案 0 :(得分:3)
您可以在一个命令中执行此操作(并且没有子shell):
sed 's/^/Name: /;q' /p/raw.txt >> /p/001.txt
在第一行前面加上“Name:”前缀,打印出来,然后退出,这样就不会处理其他行。在q
之前添加一个行号,以打印所有行(包括该号码)。输出附加到/p/001.txt
,就像您的原始代码一样。
如果你想要一系列的行:
sed -n '3,9{s/^/Name: /;p}9q' /p/raw.txt >> /p/001.txt
从第3-9行读取,执行替换,打印,然后在第9行之后退出。
如果你想要特定的线条,我推荐awk:
awk 'NR==3 || NR==9 { print "Name: " $0 } NR>=9 { exit }' /p/raw.txt >> /p/001.txt
这有两个条款。一个说记录的数量(行号)是3或9,在这种情况下我们打印前缀和行。另一个告诉我们在第9条记录之后停止阅读文件。
以下是另外两个命令,用于显示awk如何仅对第一行或给定范围起作用:
awk '{ print "Name: " $0 } NR >= 1 { exit }' /p/raw.txt >> /p/001.txt
awk '3 <= NR { print "Name: " $0 } NR >= 9 { exit }' /p/raw.txt >> /p/001.txt
看来你正在不断地从另一个文件构建一个文件。考虑:
tail -Fn0 /p/raw.txt |sed 's/^/Name: /' >> /p/001.txt
这将连续运行,只添加新条目(在命令运行后添加)到/p/001.txt
也许你有很多重复要解决的问题?
awk 'NR != FNR { $0 = "Name: " $0 } !s[$0]++' \
/p/001.txt /p/raw.txt > /tmp/001.txt && mv /tmp/001.txt /p/001.txt
这将先前保存的名称与任何新名称折叠在一起,仅打印一次名称(!s[$0]++
为零时为s[$0]
为真(默认状态)),但在评估后,它会增加到1在第二次出现时将其设为false。当一个裸子句没有动作时,就会打印该行。)因为我们正在读取输出文件,所以我们需要一个临时输出。成功完成后,我们将其移动到目标输出文件的顶部。
答案 1 :(得分:1)
printf "Name : %s\n" "$(sed -n '1p;q' /p/raw.txt)" >/p/001.txt
应该这样做。如果sed
不是必需的,那么
echo -e "Name : $(sed -n '1p;q' /p/raw.txt)" >/p/001.txt
注意强>
q
sed
选项退出,不再处理任何命令或输入。-e
选项告诉echo解释转义序列。这是bash shell的特色。