查找并删除文件中以特定字符串开头的行

查找并删除文件中以特定字符串开头的行

我的文件目前有

Name.      Address.   Phone number 
Jack.        L.A             1435672
John         L.A.            1465432
Nick.        F.l.            1489756

当用户想要从列表中删除联系人时,他输入联系人的姓名,程序会删除整行。当用户想要修改联系人时,他输入姓名并找到联系人,然后用新姓名、地址和电话号码更改它。我试图使用两个函数删除和修改来实现这一点。

答案1

sed您可以使用如下语法的命令:

sed "/^\t$name/d" in-file

在哪里:

  • 当正则表达式中需要传递 shell 变量时,我们必须使用双引号 -$name在这种情况下。

  • ^将匹配到行首。

  • \t将匹配至单个标签。

  • d最后的命令将删除与我们的正则表达式匹配的每一行/^\t$name/

您可以添加-i(或-i.bak)来创建更改以代替文件(或和创建备份副本)。或者您可以将命令的输出复制到另一个文件等:

sed "/^\t$name/d" in-file -i.bak
sed "/^\t$name/d" in-file > out-file

更多示例:

$ name='Blue'                       # assign a value to the shell variable $name

$ cat in-file                       # output the content of the input file
first line
second line
    Blue
    fourth line
Blue

$ sed "/^\t*$name/d" in-file        # remove the lines that begin ^ with 0 or more tabs followed by the value of $name
first line
second line
    fourth line

$ sed -r "/^\t+$name/d" in-file     # remove the lines that begin ^ with 1 or more tabs followed by the value of $name; enable extended regexp -r
first line
second line
    fourth line
Blue

$ sed -r "/^\t{0,1}$name/d" in-file # remove the lines that begin ^ with 0 or 1 tabs followed by the value of $name; enable extended regexp -r
first line
second line
    fourth line

$ sed -r "/^\t?$name/d" in-file     # remove the lines that begin ^ with 0 or 1 tabs followed by the value of $name; enable extended regexp -r
first line
second line
    fourth line

$ sed -r -e "/^(\t|\s|\s\t|\t\s)?$name/d" -e 's/^\t//' in-file # remove the lines that begin ^ with 0 or 1 tabs, or spaces, or spaces and tabs, or tabs and spaces`; remove the tabs in the beginning of the rest lines 
first line
second line
fourth line

编辑:以下是如何从更新的问题中提供的示例中替换整行。这里使用了sed替换命令s/regexp/replacement/

首先假设我们已经定义了以下变量集:

old_name='Jack.' old_address='L.A.' old_phone='1435672'
new_name='Tom.' new_address='F.l.' new_phone='875632'

如果我们需要精确匹配行并希望保持精确的格式,我们可以使用以下命令,该命令使用捕获组选项:(...)->\1等;此外,选项-r(使用扩展正则表达式)仅应用于语法(检查这个问题作为参考):

sed -r "s/^(\t*|\s*)$old_name(\t*|\s*)$old_address(\t*|\s*)$old_phone(\t*|\s*)$/\1$new_name\2$new_address\3$new_phone\4/" in-file

通过这种方式,我们可以捕获字段分隔符(在本例中是冷制表符和/或空格)并将它们输出到替换字符串中。

如果我们不需要如此精确,我们可以使用更简单的东西,如下所示(在捕获组的位置我们的正则表达式将期望 0 个或更多*任何类型的字符.):

sed -r "s/^.*$old_name.*$old_address.*$old_phone.*$/$new_name\t$new_address\t$new_phone/" in-file

或者更简单:

sed -r "s/^.*$old_name.*$/$new_name\t$new_address\t$new_phone/" in-file

例子:

$ cat in-file 
Name.   Address.  Phone number
Jack.   L.A.      1435672               
John.   L.A.      1465432
Nick.   F.l.      1489756

$ old_name='Jack.' old_address='L.A.' old_phone='1435672' new_name='Tom.' new_address='F.l.' new_phone='875632'

$ sed -r "s/^(\t*|\s*)$old_name(\t*|\s*)$old_address(\t*|\s*)$old_phone(\t*|\s*)$/\1$new_name\2$new_address\3$new_phone\4/" in-file 
Name.   Address.  Phone number
Tom.    F.l.      875632               
John.   L.A.      1465432
Nick.   F.l.      1489756

相关内容