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命令[重复]