我知道标题听起来有点令人困惑,但希望我的例子能够澄清我的问题。
所以我有一个包含名称列表的文件(names.txt),例如:
约翰·
大卫·
理查德
我正在尝试使用循环来获得以下结果:
约翰 约翰.
多伊 大卫 大卫.多
伊 理查德 richard.doe
不确定使用 sed 是否是正确的命令或方法,但这是我尝试过的:
for i in $(cat names.txt); do sed "s/$/ $i.doe/" names.txt; done
这种方法有点可行,但是会产生如下迭代列表:
约翰·约翰·多
伊·大卫· 约翰· 多伊·理查德 ·约翰· 多伊· 约翰·大卫·多伊·大卫 ·大卫 ·多伊·理查德·大卫
·多伊·约翰· 理查德·多伊· 大卫 ·理查德· 多伊 ·理查德·理查德·多伊
我也尝试过 while IFS= read -r 循环,也得到了类似的结果。似乎不能只处理每一行而不产生上面的结果。
我可能完全偏离了主题,但希望有人能在这里提供帮助。
提前致歉。我以前使用过 sed 但用于更简单的任务。
答案1
一种可能的方法是使用awk
.像这样的命令可以完成这项工作:
awk '{print $1,$1 ".doe"}' names.txt
答案2
你明白了吧sed
。您不需要循环sed
,它无论如何都会循环所有行。只需进行更换即可
sed 's/.*/& &.doe/' names.txt
.*
匹配整行,并&
在替换中插入整个匹配。
您无需切换工具,只需按其应有的方式使用该工具即可。
答案3
通过sed完成
sed -r -e "s/\s+//g" -e "s/.*/& &.doe/g" file1
输出
john john.doe
david david.doe
richard richard.doe