bash 中的行删除问题:将用户输入传递给 sed 与 grep?

Posted

技术标签:

【中文标题】bash 中的行删除问题:将用户输入传递给 sed 与 grep?【英文标题】:Line deleting trouble in bash: passing user-input to sed vs to grep? 【发布时间】:2012-05-20 15:14:25 【问题描述】:

MSYS 中的抨击问题:以下简单函数应删除与用户输入字符串 $kwd 匹配的所有行。

function delnote () 
   read kwd
   sed -e "/$kwd/d" -i ~/notes.txt

相反,我不断收到 "sed -e expression #1, char 0: no previous regular expression" 错误。为什么?

我是 bash 和 sed(以及 MSYS)的新手,所以我不确定这是将变量传递给 sed 还是以错误的方式使用引号的问题(我已经毫不费力地尝试将 "" 替换为'' 在许多变化中)。我尝试使用the function provided here 而不是我自己的,但仍然遇到同样的错误。

如果这是引号放错的问题,那么 sed 和 grep 在 bash 中处理用户输入的方式有什么区别? (与 sed 不同,在 grep 函数中使用 '"$*"' 确实有效。)

感谢您的帮助和解释!

【问题讨论】:

尝试使用bash -x path/to/script.sh 运行脚本或在脚本开头添加命令set -x。它启用某种调试模式,并可能揭示重要信息。 好的,这真的很奇怪,但它开始起作用了。不过,我不能直接传递我的搜索词(如delnote keyword)。它一直在等待用户输入,因此我需要在启动该功能后在单独的行上提供它。不过感谢-x,这是一件非常有用的事情! 【参考方案1】:

好的,我在复制 the solution linked above 时似乎搞砸了。现在它可以工作了,像这样:

function delnote () 
  sed -e "/`echo $*`/d" -i ~/notes.txt;

不过,作为非编码员和 n00b,我仍然希望能解释一下我的初始版本有什么问题。另外,为什么echo 似乎在这里解决了这个问题?谢谢。

【讨论】:

回显没用(你可以直接使用$*)。 $* 是传递给函数的所有参数的字符串。所以在这种情况下,你实际上是在使用 args。在您的第一个示例中,您正在从标准输入读取,这可能不是您想要的。 感谢您的评论。我已经删除了不必要的“回声”,并在 bash stdin 等上做了一些阅读。

以上是关于bash 中的行删除问题:将用户输入传递给 sed 与 grep?的主要内容,如果未能解决你的问题,请参考以下文章

使用 bash (sed/awk) 提取 CSV 文件中的行和列?

通过 Bash 从文本文件中删除空行,包括空格字符 [重复]

通过回声管道将python变量(字符串)传递给bash命令[重复]

使用 argparse 将多个 bash 数组传递给 Python

我可以使用 sed 来操作 bash 中的变量吗?

Bash脚本从.txt文件中删除特定行[重复]