我有一个名为catalog的文本文件,其中每行都有一个姓名,一个姓氏,一个城市和一个这样的电话号码:
John McJohn Detroit 0301234568
Donald Duck Lake_City 1234567890
Deez Nutz Oxford 2305985531
我希望编写一个脚本,将关键字作为参数,并用空行替换其关键字。
这是我到目前为止的地方:
t1=$(grep $2 catalog) #$2 is the keyword
echo the lines with that keyword are:
echo $t1
t2=$(echo) #a blank line
t3=$(tr '$t1' '$t2' < catalog) #replacing each line with the keyword with a space
echo The lines have been deleted #not really, they have been replaced with a space
cat catalog
这根本不会改变文件。
我尝试了很多sed的表达,没有任何运气(我在旧的xubuntu版本上运行脚本,所以我不知道sed是否适用于此)。
我试图更换&#34; t2 = $(echo)&#34;用&#39; \ n&#39;但如果失败了。
怎么做到这一点? 是否可以将每个行替换为空白行?
(可能和&#34;工作正常&#34;回答:
t1=$(grep $2 catalog)
echo the lines with that keyword are:
echo $t1
sed "./*$t1.*/s///" catalog
sed "./*$t1.*/s///" catalog > catalogtemp
mv catalogtemp catalog
)
答案 0 :(得分:0)
使用awk
:
awk -v key="${the_key}" '$0 ~ key{$0=""}1' file
我将shell变量${the_key}
作为参数传递给awk
。 awk
将整行($0
)与键匹配,如果匹配则将整行设置为空字符串。最后的1
将始终评估为true
,并使awk
打印所有输入行,修改与否。
答案 1 :(得分:0)
使用sed:
$ t1="Donald";
$ sed "s/.*$t1.*//" file
John McJohn Detroit 0301234568
Deez Nutz Oxford 2305985531
要编辑文件,请使用-i
fag:
sed -i "s/.*$t1.*//" file
修改强>
更安全的语法,以避免不必要的参数扩展:
sed 's/.*'"$t1"'.*//' file
答案 2 :(得分:0)
您可以在oneliner中执行此操作:
sed -i "s/^.*<keyword>.*$//" <filename>
因此,如果您的文件名为catalog,而您的关键字是Donald,则脚本将为:
#!/bin/bash
# Should be [[ "$1" == "" ]], leaving the previous
# version for comments to be valid
if [ "x$1" == "x" ]; then
exit 1
fi
sed -i "s/^.*${1}.*$//" calatog
您可以将脚本称为
./<script_name> Donald