【问题标题】:How to to delete a line given with a variable in sed?如何删除sed中带有变量的行?
【发布时间】:2016-05-11 12:04:45
【问题描述】:

我正在尝试使用sed 从名称存储在变量中的文件中删除从用户输入读取的行。现在sed 所做的只是打印该行,而不是别的。

这是我正在使用的命令的代码 sn-p:

FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"'d' "$FILE"

这里有什么我遗漏的吗?

编辑:-i 切换-e 选项解决了我的问题!

【问题讨论】:

  • 除非删除行是需要分隔的行号。请显示有问题的行以及变量包含的内容。
  • @123 我不确定,但我很确定 bash 的读取将用户输入作为字符串。我认为这可能是一个障碍。我将如何修复它以使其正常工作?编辑:用变量更新。
  • 请显示有问题的行以及变量包含的内容。
  • bobby tables,你需要验证你的用户输入:如果我输入1,$,我刚刚删除了每一行。
  • @glenn jackman 会的。我有一个条件来确保输入是一个数字并且在一个范围内。该脚本仍处于起步阶段,但由于它仅供我自己使用,所以我不太担心。

标签: linux bash sed


【解决方案1】:

您需要对搜索进行定界。

#!/bin/bash

read -r Line

sed "/$Line/d" file

将删除包含键入输入的任何行。

请记住,虽然 sed 匹配正则表达式,但任何特殊字符都将被视为此类。
例如,搜索1* 实际上会删除包含任意数量的 1 的行,而不是实际的 1 和星号。

还请记住,当变量扩展时,它不能包含分隔符,否则命令会中断或产生未扩展的结果。

例如,如果“$Line”包含“/hello”,那么 sed 命令将失败并显示 sed: -e expression #1, char 4: extra characters after command.

在这种情况下,您可以转义 /,也可以使用不同的分隔符。

我个人会为此使用 awk

awk -vLine="$Line" '!index($0,Line)' file

搜索精确的字符串并且没有 sed 命令的缺点。

【讨论】:

  • 从技术上讲,您的命令不起作用,但这只是因为它需要 -i 选项。事实上,我的命令现在只使用 -i 选项在没有分隔符的情况下工作。所以基本上 sed -i "$LINE"'d' "$FILE" 工作得很好。感谢您的帮助!
  • 使用 bash,您可以穿过倾斜的牙签林:sed "/${Line//\//\\/}/d" file 以转义参数中的任何斜线。但是 +1 建议使用字符串比较函数而不是正则表达式。
  • 如果您担心变量中可能有/ 字符,您可以随时更改sed 使用的分隔符,在这种情况下使用: 作为分隔符:sed "\:$Line:d"
  • @AlexR 是的,提到了You can either escape the / in this case or use different delimiters.
【解决方案2】:

用 grep 代替 sed 可能会成功

read -p "Enter a regex to remove lines: " filter
grep -v "$filter" "$file"

就地存储需要更多工作:

tmp=$(mktemp)
grep -v "$filter" "$file" > "$tmp" && mv "$tmp" "$file"

或者,sponge

grep -v "$filter" "$file" | sponge "$file"

注意:尽量改掉使用 ALLCAPSVARS 的习惯:有一天你会accidentally use PATH=... and then wonder why your script is broken

【讨论】:

    【解决方案3】:

    请试试这个:

    sed -i "${DELETELINE}d" $FILE
    

    【讨论】:

      【解决方案4】:

      我发现了这个,它允许使用变量进行范围删除:

      #!/bin/bash
      
      lastline=$(whatever you need to do to find the last line)` //or any variation
      
      lines="1,$lastline"
      
      sed -i "$lines"'d' yourfile
      
      keeps it all one util.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        相关资源
        最近更新 更多