【问题标题】:Sed appears to be deleting the full lineSed 似乎正在删除整行
【发布时间】:2015-01-17 08:48:23
【问题描述】:

大家好,我正在尝试使用 sed 删除部分字符串(它的目录)。我就是这样用的

sed -i 's/$1//g' ~/Desktop/RecyclingBin/logs/$1

每当我打开文本文件时,它似乎都是空白的。任何帮助将不胜感激..

此外,如果有一种更简单的方法可以将文件位置输出到文本文件,而输出中没有实际的文件名,这将使当前使用的生活变得更加轻松:

find $PWD -type d -name "*$1*" >> ~/Desktop/RecyclingBin/logs/$1

提前谢谢你!

【问题讨论】:

  • 糟糕的问题。我们不知道$1 是一个参数还是应该是literal。另外,使用更多报价! mywiki.wooledge.org/BashGuide/Practices#Quoting
  • 道歉。这是一个参数
  • 参数将是文件的名称,例如,如果我删除一个名为“test”的文件,我希望日志中的文件名是“test”,文件的内容是存储位置
  • 都在一个文件夹 ~Desktop/RecyclingBin/logs 中。所以如果我要删除“测试”一个文件将在里面 ~Desktop/RecyclingBin/logs/test

标签: linux bash sed scripting find


【解决方案1】:

如果你想在 sed 表达式中使用变量,你应该像上面发布的例子一样使用“”。这是sed的特点

否则正常替换使用单引号..

【讨论】:

  • "..."(双引号字符串)中使用 shell 变量是 shell 功能,与sed - sed 无关- 或任何其他外部实用程序,就此而言 - 只能看到 shell 字符串插值的 result'...'(单引号)字符串也是一个shell特性——只有在这种情况下,字符串内容按原样传递给sed(无插值)。了解 shell 的前期工作与 sed 最终看到的内容之间的区别,因为它的脚本很重要。
【解决方案2】:

永远记住,如果你想在 sed 表达式中使用变量,你应该像上面发布的例子一样使用 ""

否则正常替换使用单引号..

【讨论】:

    【解决方案3】:

    尝试使用我的示例

    sed -i "s/$1//g" ~/Desktop/RecyclingBin/logs/$1
    

    它对我有用。

    【讨论】:

    • 仍然得到一个空白文件
    • ok 让我们弄清楚,你写的字符串需要参数 $1,然后打开文件 ~/Desktop/RecyclingBin/logs/$1 然后在这个文件模式中删除 $1。是否符合您的预期?
    • 我会给你一个我在做什么的例子:参数是一个文件名。该脚本将此文件的位置写入日志文件夹内的新文件中。然后脚本从这个新文件中的目录字符串中删除文件名(/logs/test 现在变成 /logs/)
    • 显示“空”文件的已执行行(带有集合 -vx)的跟踪
    【解决方案4】:

    您可以在 find 本身中执行此操作:

    find . -type d -name "*$1*" -exec bash -c 'echo "${1##*/}"' - {} \;
    

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多