sed 命令查找与替换:mysql
(1)删除第2,3行:sed '2,3d' test.txt > new.txt正则表达式
(2)替换:
替换全部:sed 's/abc/ABC/' test.txt >new.txt
查找: sed -n "/abc/p" test.txtsql
匹配字符串中的一部分: echo abc123 | sed 's/\([a-z]*\).*/\1/'spa
echo "ab001_ac" | sed 's/\(.*\)\_\(.*\)/\1,\2/' \1表示第一个括号匹配的字符
echo "ABC01" | sed "s/[A-Z]*\([0-9]*\)/\1/" \1匹配后面的数字部分3d
echo "ab001_AC88" | sed 's/[A-Z]*\([0-9]*$\)/\1/'ip
echo "a001_aaST88" | sed "s/\(.*\)\([A-Z][A-Z]\)\([0-9]*$\)/\2/"字符串
sed "s/^/\"&/" <31.txt >32.txt 行首添加双引号
sed "s/$/\"&/" <32.txt >33.txt 行尾添加双引号
sed "s/[ ]*$//" <34.txt >35.txt 替换行尾空格input
只显示指定行范围的文件内容,例如:test
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.logawk
sed -n $n"p" 22.txt 显示某一行 n=2
sed大小写转换?
如何先查找,再追加所查找的行到一个新的文件:
(3)查找Tab:
sed "s/[ ]\{2,\}/\|/g" 查找Tab,查找多空格,单独一个空格的除外
awk '/3\t/' 34.txt 查找\t
sed -n '/3[[:space:]]/p' 34.txt 查找空格
sed "/\\t/p" 34.txt 查找tab
echo "\tabc\t23" | sed 's/[[:tab:]]/-/' 替换tab
sed -n '/[[:space:]]*/p' 34.txt 查找tab
如何只替换第2个\t?
(4)
行末空格
sed 's/[ \t]*$//g'
(5)替找空格:
echo "abc 23" | sed 's/[ ]\{2,\}/ /' 把多个空格替换成一个空格
(3)
若是你想在每行的80个字符后加一个冒号,你可写:
sed ‘s/./&:/80’ < file > new
你也能够以蛮力解决,以下:
sed 's/^................................................................................/&:/' <file >new
(4)找一个sed命令在文件每一行加一个变量的例子:
sed 's/.*/&-/' <20.txt >new.txt
用&做为匹配的串
有时你想查找一个模式,而后加上几个字符,好比在匹配的串先后加上括号。若是你是找一个肯定的字符串,仍是比较简单的,以下便可:
sed ‘s/abc/(abc)/’ < old > new
若是你不是很是清楚你将找到的是串是什么,那你应该若是来利用你找到的串作某种替换呢?
答案就是你须要一个特定的字符”&”,它即指代匹配的模式
sed ‘s/[a-z]*/(&)/’ < old > new
你能够在替换时屡次使用”&”,好比,你能够次每行开头的数字复制一次,以下:
% echo “123 abc” | sed ‘s/[0-9]*/& &/’
123 123 abc
让我再修正一下这个例子,sed会以贪婪的方式匹配第一个串。对于’[0-9]*’的第一个区配是第一个字符,由于这个正则是匹配0个或多个数字。因此若是输入是”abc 123”,输出也不会改变(固然,除了有一个空格在字母以前)。一个能保证能匹配一个数字的更好的复制数字的方法是:
% echo “123 abc” | sed ‘s/[0-9][0-9]*/& &/’
123 123 abc
(5)sed 中如何使用变量(变量使用单引号包起来):
echo "abc" | sed 's/ab/'$v'/'
如何在文件的每一行的最前面加一个字符串和空格!
sed 's/^/ttt /g' test
如何在文件的每一行的最前面加一个字符串和空格!
sed 's/^/ttt /g tese | sed 's/$/ sss\&/g'
如何在文件的每一行的最前面加一个字符串和空格!
sed 's/^/ttt /g tese | sed 's/$/ sss\&/g'
(7)匹配空行:
查找空行:sed -n "/^$/p" 20.txt
删除空行:sed "/^$/d" <20.txt >21.txt
n 不打印; sed不写编辑行到标准输出,缺省为打印全部行(编辑和未编辑),p命令能够用来打印编辑行
c 下一命令是编辑命令,使用多项编辑时加入此选项
f 若是正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如
sed -f myscript.sed input_file 这里myscript.sed即为支持sed命令的文件
(21) 只显示指定行范围的文件内容,例如:
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log
(22)退出状态
sed不向grep同样,无论是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
(23)y命令
该命令与UNIX/Linux中的tr命令相似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把全部小写的a转换成A,小写的b转换成B,小写的c转换成C。
sed '1,20y/hrwang12/HRWANG^$/' datafile
#将1到20行内,全部的小写hrwang转换成大写,将1转换成^,将2转换成$。
#正则表达式元字符对y命令不起做用。与s命令的分隔符同样,斜线能够被替换成其它的字符。
(24)% echo “123 abc” | sed ‘s/[0-9][0-9]*/& &/’
123 123 abc
字符串”abc”没有改变,由于它没有匹配正则表达式,若是你想在输出中删除”abc”,你必须扩展正则表达式来匹配行的其它的部分,并显式地用”(”,”)”和”\1”来指名,这就是下节的内容了。
用\1来指明匹配的部分
我已经在正则表达式那一章中介绍了”(” ”)”和”\1”的用法。如今复习一下,被转义的括号(即,有反斜杠在前面的括号)来记录正则表达的某一部分。”\1”是被记录的第一个模式,”\2”是第二个被记录的模式。Sed能够记录9个模式。
若是你想保存每行的第一个单词,并删除行的其它部分,你能够用下面的命令:
sed ‘s/\(\[a-z]*).*/\1/’
我应该再详细地解释一下。正则表达式是以贪婪的方式匹配。”[a-z]*”匹配0个或多个小写字母,它会尽可能匹配更多的小写字母。”.*”会在第一个匹配后匹配0个或多个字符。由于第一个模式已经匹配了全部的小写字母,第二个模式会匹配剩下的字符,因此你使用命令:
echo abcd123 | sed ‘s/\([a-z]*\).*/\1/’
会输出”abcd”,而删除后面的数字。
若是你想调换两个单词的位置,你可记录两个模式,并改变它们的次序。
sed ‘s/\([a-z]*\) \([a-z]*\)/\2 \1/’
注意两个模式中间是有空格的。这个可保证找到两个单词。可是[a-z]*这种模式会匹配0个字母,若是你想至少匹配一个字母,你能够用下面的命令:
sed ‘s/\([a-z][a-z]*\) \([a-z][a-z]*\)/\2 \1/’
“\1”并不须要必定出如今替换串中(右部),它你也能够在查找的模式中(左部)。若是你想删除重复的单词,你能够用:
sed ‘s/\([a-z]*\) \1/\1/’
注意你最多使用9个值,从”\1”到”\9”