Answers:
grep
方法要创建文件副本而没有匹配“ cat”或“ rat”的行,可以使用grep
反向(-v
)和全字词选项(-w
)使用。
grep -vwE "(cat|rat)" sourcefile > destinationfile
整个字选项可以确保它不会匹配cats
或grateful
例如。Shell的输出重定向用于(>
)将其写入新文件。我们需要一个-E
选项来启用(one|other)
语法的扩展正则表达式。
sed
方法或者,要删除就地行,可以使用sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
该\b
套字边界和d
操作删除匹配斜杠之间表达的行。cat
并且rat
两者都与(one|other)
我们显然需要用反斜杠转义的语法匹配。
提示:覆盖文件之前,请在sed
无-i
操作员的情况下测试命令的输出。
(基于Sed-删除包含特定字符串的行)
要仅在终端中进行测试,请使用:
sed '/[cr]at/d' file_name
要真正从文件中删除这些行,请使用:
sed -i '/[cr]at/d' file_name
在工作/bin/sh
,这是dash
在Ubuntu,以及ksh
和bash
。有点尴尬,您必须为case
语句中的每个单词编写多个测试用例,但它们是可移植的。适用于单词在行中,行首,行尾或行中单独出现而忽略该单词可能是另一个单词的一部分的情况。
#!/bin/sh
line_handler(){
# $1 is line read, prints to stdout
case "$1" in
cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
rat|rat\ *|*\ rat\ *|*\ rat) true;;
*) printf "%s\n" "$1"
esac
}
readlines(){
# $1 is input file, the rest is words we want to remove
inputfile="$1"
shift
while IFS= read -r line;
do
line_handler "$line" "$@"
done < "$inputfile"
[ -n "$line" ] && line_handler "$line"
}
readlines "$@"
这是它的工作方式:
$ cat input.txt
the big big fat cat
the cat who likes milk
jumped over gray rat
concat
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt
concat
this is catchy
rational
irrational