我有一个文件,其中有一些行,例如:
account_1
account_2
account_3
我必须/home/info/
在每行之前添加一个路径,并使用这些更新保存相同的文件,如下所示:
/home/info/account_1
/home/info/account_2
/home/info/account_3
我该如何在 AIX 上处理这个问题?
答案1
要将任何字符串添加到文件中每一行的开头,您可以使用
sed -i 's#^#/home/info/#' file
这将对调用的文件进行就地编辑file
,并将字符串插入/home/info/
到每行的开头。
在 FreeBSD 或衍生产品(如 macOS)上,您必须使用-i ''
而不是-i
(另请参阅“如何使用 sed -i (就地编辑)实现可移植性?”)。
由于替换文本包含 ,因此此处用作表达式的#
分隔符。我们也可以写sed
/
sed -i 's/^/\/home\/info\//' file
但这读起来和写起来都有点困难(参见维基百科:牙签倾斜综合症)。
一如既往,跑sed
没有首先选择该-i
选项以确保其执行正确的操作。
sed
对于不支持-i
就地编辑的系统,您必须将结果写入临时文件,然后用该文件替换原始文件:
sed 's#^#/home/info/#' <file >file.new &&
mv file.new file
sed
如果命令成功,这将用修改后的文件替换原始文件。
如果您需要保留元数据,例如所有权和文件权限,请这样做
cp file file.tmp &&
sed 's#^#/home/info/#' <file.tmp >file &&
rm file.tmp
答案2
拘萨罗南达的回答与 sed 很好;我将提出一个替代方案——使用 进行就地编辑ed
,它默认安装在 AIX 上:
ed -s input <<< $'1,$s!^!/home/info/!\nw\nq'
或者更简洁地,用作整个文件地址范围,
的快捷方式:1,$
ed -s input <<< $',s!^!/home/info/!\nw\nq'
这个想法在其他方面与 sed 中的相同——使用 earchs
并使用分隔符替换命令,即不是出现在搜索或替换文本中,以避免 LTS;而不是#
我随意选择的!
。其余命令由换行符分隔,并指示ed
将w
文件写回并q
退出。命令全部作为此处字符串发送到ed
命令。我使用该-s
标志进入ed
“脚本模式”,它使输出安静(此处读取和写入的字节)。
要使用此处的字符串,您需要使用克什93,也存在于库存 AIX 系统上。
除了此处的字符串之外,还可以使用printf
:
printf '1,$s!^!/home/info/!
w
q
' | ed -s input
为了便于阅读,我将ed
命令分成多行,或者全部放在一行中:
printf '1,$s!^!/home/info/!\nw\nq\n' | ed -s input
除了 printf 之外,这里文档也可以工作:
ed -s input << 'EOF'
1,$s!^!/home/info/!
w
q
EOF
答案3
外部替代 com awk
awk -i inplace '{ print "/home/info/" $1 }' file
/home/info/account_1
-i inplace
inplace 扩展模拟 GNU sed 的-i
选项,该选项对每个输入文件执行“就地”编辑。它使用捆绑的 inplace.awk 包含文件来正确调用扩展:print "/home/info/"
连接第一个字段。$1 代表文件的第一个字段。