14
sed -i '/first/i This line to be added' 

在这种情况下,如何在搜索模式时忽略大小写 =first

4

6 回答 6

31

您可以使用以下内容:

sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file

否则,你有/I和 n/i标志:

sed 's/first/last/Ig' file

从 man sed

一世

正则表达式匹配的 I 修饰符是一个 GNU 扩展,它使 sed 以不区分大小写的方式匹配正则表达式。

测试

$ cat file
first
FiRst
FIRST
fir3st
$ sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file
last
last
last
fir3st
$ sed 's/first/last/Ig' file
last
last
last
fir3st
于 2013-06-04T12:19:43.103 回答
8

GNU sed

sed '/first/Ii This line to be added' file
于 2013-06-04T12:40:14.587 回答
5

你可以试试

sed 's/first/somethingelse/gI'
于 2013-06-04T12:27:37.710 回答
3

如果您想节省一些输入,请尝试 awk。我认为 sed 没有那个选项

 awk -v IGNORECASE="1" '/first/{your logic}' file
于 2013-06-04T12:26:07.057 回答
1

使用以下内容,\b 表示单词边界

sed 's/\bfirst\b/This line to be added/Ig' file
于 2019-10-12T05:33:02.030 回答
1

对于不理解IGNORECASE特殊变量的 awk 版本,您可以使用如下内容:

awk 'toupper($0) ~ /PATTERN/ { print "string to insert" } 1' file

在测试它是否匹配模式之前将每一行转换为大写,如果匹配,则打印字符串。1是最短的真实条件,所以 awk 做了默认的事情:{ print }.

要使用变量,您可以这样做:

awk -v var="$foo" 'BEGIN { pattern = toupper(foo) } toupper($0) ~ pattern { print "string to insert" } 1' file

这会在处理文件之前传递 shell 变量$foo并将其转换为大写。

使用 bash 稍微短一点,就是使用-v pattern="${foo^^}"并跳过该BEGIN块。

于 2016-04-29T09:16:17.997 回答