• sed 文件查找,替换


    sed 命令查找与替换:


    (1)删除第2,3行:sed '2,3d' test.txt > new.txt

    (2)替换:
     替换所有:sed 's/abc/ABC/' test.txt >new.txt
     查找:    sed  -n "/abc/p" test.txt

     匹配字符串中的一部分: echo abc123 | sed 's/([a-z]*).*/1/'

     echo "ab001_ac" | sed 's/(.*)\_(.*)/1,2/'      1表示第一个括号匹配的字符
     echo "ABC01" | sed "s/[A-Z]*([0-9]*)/1/"           1匹配后面的数字部分

     echo "ab001_AC88" | sed 's/[A-Z]*([0-9]*$)/1/'

     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 替换行尾空格


     只显示指定行范围的文件内容,例如:

    # 只查看文件的第100行到第200行
    sed -n '100,200p' mysql_slow_query.log

    sed -n $n"p" 22.txt  显示某一行  n=2

    sed大小写转换?


    如何先查找,再追加所查找的行到一个新的文件:

     

    (3)查找Tab:
    sed "s/[ ]{2,}/|/g"          查找Tab,查找多空格,单独一个空格的除外

    awk '/3 /' 34.txt  查找

    sed -n '/3[[:space:]]/p' 34.txt  查找空格

    sed "/\t/p" 34.txt  查找tab

     echo " abc 23" | sed 's/[[:tab:]]/-/' 替换tab

    sed -n '/[[:space:]]*/p' 34.txt  查找tab
    如何只替换第2个 ?

    (4)
    行末空格 
    sed 's/[ ]*$//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”

  • 相关阅读:
    swift3.0 运行时获取类的属性
    Runloop与autoreleasePool联系
    iOS 加载Image的两种方式
    iOS strong与weak的使用
    iOS 自定义layer的两种方式
    iOS 手势识别
    iOS Quartz2D画图
    iOS 通知的使用
    UITableViewController
    UITableView移动
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696306.html
Copyright © 2020-2023  润新知