Shell脚本:用空行替换文件的一行

时间:2016-12-17 13:28:22

标签: linux bash shell ubuntu sed

我有一个名为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

3 个答案:

答案 0 :(得分:0)

使用awk

awk -v key="${the_key}" '$0 ~ key{$0=""}1' file

我将shell变量${the_key}作为参数传递给awkawk将整行($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