无法使用-sed从文本文件中删除值

时间:2016-02-04 15:33:06

标签: bash sed terminal

我正在尝试使用一系列命令(使用终端)从文本文件中删除ID号,但它们似乎不起作用。我需要删除号码和相关的“ID”文本

文件中的文字: { “ID”: “098765432”}

我一直在使用的命令(但似乎没有用):

sed -i.bak 's/"id":[0-9]\{1,\},//g' ./Filename.txt
sed -i.bak 's/"id":"[0-9]\{1,\}",//g' ./Filename.txt
sed -i.bak 's/"id":"[0-9]\{9,\}",//g' ./Filename.txt
sed -i.bak 's/"id":[0-9]\{9,\},//g' ./Filename.txt
sed -i.bak 's/"[0-9]\{1,\}",//g' ./Filename.txt

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

正如@Wintermute已在评论中注明,问题出在//之前的逗号中。但是,我将解释整个问题,以便其他人可以完全理解它,以防后来遇到这个问题的人不清楚。

因此,满足您要求的正确命令是:

sed -i.bak 's/"id":"[0-9]\{1,\}"//g' ./Filename.txt

sed 是调用stream editor的命令。

标志 -i 是用于表示编辑文件的标志(如果提供了扩展,则进行备份)。在这种情况下,写入的扩展名为 .bak ,实际上,备份文件(包含我们文件的初始上下文)是使用原始名称+提供的扩展名创建的。

参数' s /" id":" [0-9] {1,}" // g' 是给sed命令的参数。

由于这个论点(regular expression)是问题的原因,我将详细解释。

我们应该注意的第一部分是它的结构 s / Regex / Replacement / g 其中

Regex =" id":" [0-9] {1,}"

替换=没有(几乎没有,甚至没有空格)

基本上,如Bruce Barnett所述, s 代表替代。 正则表达式是我们将替换为替换的部分。最后,字母 g 意味着我们每行更改的不仅仅是这个正则表达式的一次出现(没有g,它将只替换每行中的第一个匹配项,无论有多少个)

最后我们有 ./ Filename.txt ,这是我们应用此命令的源文件( ./ 表示该文件位于我们运行此命令的目录。)

关于使用的正则表达式(" id":" [0-9] {1,}"):

它以文字开头(" id":"),这部分将完全匹配文件中与此文件完全相同的任何部分。接下来,我们有([0-9] {1,}),这意味着除了第一部分之外,我们还希望查找至少一次出现的数字(但它可以更多,如同问题的匹配示例显示)。

现在您可以理解为什么逗号会导致此问题。文件中的原始文本中没有逗号。因此,没有尝试过的命令(因为它们都包含逗号)。当然,其中一些还有更多原因。

编辑:正如@ghoti所指出的,替换不是正则表达式。它是我们将放置在我们的正则表达式找到的位置的字符串。所以在这种情况下,我们的替换是空字符串(因为我们要删除指定的部分)。