我的文件目前有
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