使用 Linux Shell 处理文本 - 第 1 部分
进入世界sed
进入世界sed
如果您每天都在使用任何 * nix系统,那么您很可能已经熟悉,或者至少听说过该sed
命令。
sed
(缩写Stream Editor
)是一款文本转换工具,每个 Unix 系统都自带。它sed
与其他文本编辑器的区别在于其文本操作速度。sed
它只对输入文本进行一次处理,因此处理速度更快。
# 替换那些丑陋的文字
sed
是一个非常强大的工具,可以用一段文本替换另一段文本。可以使用正则表达式匹配文本。
sed 's/text_to_be_replaced/replacement_text/' file_name
但是,这只会在控制台中打印替换后的文本,而不会更改文件本身。如果我们想将更改保存到文件中,可以使用该-i
标志。
sed -i 's/text_to_be_replaced/replacement_text/' file_name
上面的代码只替换每行中给定模式的第一次出现。因此,如果我们想替换该模式的每次出现,我们可以将g
参数附加到末尾。
sed 's/text_to_be_replaced/replacement_text/g' file_name
/
请注意,我们在以上命令中使用的分隔符不是固定的,我们几乎可以使用任何分隔符sed
。例如,
sed 's:text_to_be_replaced:replacement_text:g' file_name
sed 's|text_to_be_replaced|replacement_text|g' file_name
好的,但是如果分隔符本身就是要替换的模式的一部分怎么办?¿ⓧ_ⓧﮌ
好吧,我们可以用反斜杠来转义这个字符。例如,要将单词替换following:
为below -
,我们可以这样做:
sed 's:following\::below - :' file_name
请注意在分隔模式和替换的\:
分隔符之前的使用。:
# 删除该剪贴簿留言
sed
还允许我们从文件中删除行。该d
选项用于指示删除操作。删除行的通用语法是
sed 'Nd' file_name
这N
是我们要删除的行号。如果我们想删除文件的第 10 行,N
那么行号就是 10。
此命令最常见的用途是删除文件中的所有空行。
sed '/^$/d' file_name
上述代码将删除文件中所有空行。正则表达式^$
标记空行,d
选项指定应删除该行。
不仅如此,我们还可以指定要删除的行范围。
sed 'm,nd' file_name
m
上述命令将删除从th 开始到th 的所有行n
。
# 流水线很重要
那么如何对多个sed
命令进行流水线化呢?
我们可以根据需要流水线化任意数量的管道sed
,它们将按照指定的顺序进行处理。请考虑以下示例。
echo Linux | sed 's/L/l/' | sed 's/n/N/' | sed 's/l/L/' | sed 's/x/X/'
这将输出LiNuX
。
最后,我们来看看如何在sed
命令中使用变量。到目前为止,我们' '
在命令中使用了单引号。但是," "
当我们需要在命令中使用表达式时,也可以使用单引号。请看下面的例子。
greet=hello
echo hello shamil | sed "s/$greet/hi" file_name
这将替换评估和的值$greet
并hello
用替换hi
。
# 安全总比后悔好
-i
在命令中使用时sed
,我们需要小心,因为它会替换文件中的实际内容。(相信我,我已经做过很多次了)
因此,最好先使用此命令而不使用-i
任何标志,然后检查替换是否正确。但是,如果文件内容太长而无法通过这种方式检查,则可以使用以下命令创建相同的备份副本,然后修改内容。
sed -i.bak '12,30d' file_name
这将删除从第 12 行到第 30 行的所有行,但最重要的是,它将在修改实际文件之前file_name.bak
在同一目录中创建一个。
谁知道呢,这也许最终能保住你的工作 (◠﹏◠)
(编辑:有关用法的更多信息,请参阅此评论-i
)