如何在 file.txt 中每行的第一个字符之前添加路径并保存包含这些编辑的同一文件?

如何在 file.txt 中每行的第一个字符之前添加路径并保存包含这些编辑的同一文件?

我有一个文件,其中有一些行,例如:

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;而不是#我随意选择的!。其余命令由换行符分隔,并指示edw文件写回并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 代表文件的第一个字段。

相关内容