【问题标题】:Sed append to end of line directorysed 附加到行尾目录
【发布时间】:2014-12-20 22:05:21
【问题描述】:

我对 SED 非常陌生,我很难尝试追加到目录的末尾。我正在做的事情涉及 sed 的 2 项基本操作,但由于某种原因,脚本运行后没有进行任何更改。我将展示我的脚本片段

我有一个 bash 脚本,它从主机中提取我的主目录并定义了 ID 变量。

USERNAME="test"

#pull the home directory
dir=$(ssh -n -t $SERVERNAME "echo \$HOME";)    

上面的例子将 /export/home/ID 存储在 dir 变量中

echo $dir | sed 's/\([/export/home]*\).*/\1/' > olddir    

上面的 sed 命令将 /export/home/ 存储在文件 olddir 中(去掉结尾)

sed -i 's_/home/$ _\$USERNAME_' olddir    

我现在尝试使用带有转义的$ 的已定义变量将/export/home/ 更改为/export/home/test

脚本运行后,/export/home/ 仍然作为 olddir 文件中的条目。 我正在使用-i 修改文件,我认为我正确使用了分隔符?我做错了什么?我什至从 USERNAME 变量中删除了$,它没有做任何事情。我知道我错过了一些小东西,但我就是想不通。非常感谢您抽出时间回答我的问题。

【问题讨论】:

  • 为什么需要辅助文件?从您的dir 变量中,您可以在变量newdir 中获得您想要的内容,如下所示:newdir=${dir%/*}/$USERNAME。现在它失败的原因是因为您使用的是单引号:bash 禁止在单引号内扩展变量。相反:sed -i 's_/home/$_'"$USERNAME"'_' olddir 应该可以工作。

标签: bash variables unix sed directory


【解决方案1】:

我认为您的命令行可以修改,然后将输出重定向到 olddir,如下所示:

echo $dir | sed 's#\(/export/home\).*#\1#' > olddir    

添加用户名变量

sed -i "s#/export/home#&/$USERNAME#" olddir 

【讨论】:

  • 你好 Xorg。我尝试了您提供的内容,并且由于您的帮助,我正在取得进展。在这一点上,在我使用了你的sed -i 's_/export/home_&/$USERNAME_' olddir 之后,但现在它把$USERNAME 不是变量值,而是在 /home/ 目录后面的字段中的文字字符 $USERNAME 。 /export/home/$USERNAME 我什至尝试在 USERNAME 中转义 $,但这并没有什么不同,我使用您的备用命令重定向输出,结果相同。不过,我确实在玩过之后找到了解决方案。我会发布它。
【解决方案2】:

在使用提供的信息并使用代码后,我找到了一个适用于 /export/home/ID 和 /home/ID 情况的解决方案。

我使用了 Xorg 和 gniourf_gniourf 的建议,以下是我的结果。

echo $dir | sed 's_\([/export/home\]*\).*_\1_' > olddir

上面的代码是我解决方案的第一部分。 我使用了 Xorg 为上述代码提供的内容,但看起来我需要那些 [] 所以我可以使用 *\ 如果我将它作为 echo $dir | sed 's_\(/export/home\).*_\1_' > olddir 然后 olddir 文件将在以下 sed 之后包含 /export/home/ID/test使用命令。

这是我使用的以下 sed 命令:

sed -i 's_/home_&/'"$USERNAME"'_' olddir

上面的代码是我解决方案的第二部分。我想我真的只需要关注 /home/ 因为我在它后面追加。我查看了 gniourf_gniourf 的评论,并使用了引号将 $USERNAME"" 隔离的示例,这似乎是您可以告诉脚本使用 $USERNAME 作为变量而不只是放入字符 $USERNAME 的方式。

所以在脚本运行后,根据主机,我要么有export/home/test/ 要么/home/test/ 现在我可以将其中任何一个放入脚本上的一个新变量中,用于在创建 ID 时指定主目录远程主机!

newdir="$(cat olddir)"

非常感谢大家的帮助。没有你的帮助,我无法解决这个问题。

更新:原来目录末尾的 traling / 有问题,所以我找到了一种更简单的方法来替换主目录中的 ID

newdir="${dir/ID/${USERNAME}}"

我在两种主目录情况下都使用了这些 if 语句

`if [[ $dir == "/home/dhabinsk" ]];然后 newdir="${dir/dhabinsk/${USERNAME}}" 菲

if [[ $dir == "/export/home/dhabinsk" ]]; then
    newdir="${dir/dhabinsk/${USERNAME}}"
fi`

干杯

【讨论】:

  • 对不起,我之前的评论中有垃圾,但我不能再编辑它了(5 分钟后)。此解决方案可能适用于您的特殊情况,但通常是错误的。您的第一个命令不是搜索表达式“/export/home/”,而是搜索以任何特定顺序排列的一堆字母。例如,检查它是否匹配“/home/em/”,而不是丢弃最后一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2012-04-30
相关资源
最近更新 更多