sed 是一个很强大的处理字符串的命令, 核心功能是过滤和替换。
这里简单记录一下。
语法: s/regexp/replacement/
例如下面的替换行首空白和行尾空白的命令。
skyyuan:~ $ echo " 123 "
123
skyyuan:~ $ echo " 123 " | wc -c
10
skyyuan:~ $ echo " 123 " | sed 's/^\s*//g'
123
skyyuan:~ $ echo " 123 " | sed 's/^\s*//g' | wc -c
7
skyyuan:~ $ echo " 123 " | sed 's/\s*$//g'
123
skyyuan:~ $ echo " 123 " | sed 's/\s*$//g' | wc -c
7
skyyuan:~ $ echo " 123 " | sed 's/^\s*\|\s*$//g'
123
skyyuan:~ $ echo " 123 " | sed 's/^\s*\|\s*$//g' | wc -c
4
上面的替换内容是空,我们可以换成其他的来使效果更明显些。
例如在字符串的前后都加上一个特殊符号,来区分开头语结尾。
skyyuan:~ $ echo " 123 " | sed 's/^\|$/|/g'
| 123 |
由于这里是介绍sed的,所以这里不详细讲解正则表达式了。
这里简单的罗列出基本的sed中的正则符号。
^代表行首$代表行尾\|代表或者,只要满足一个就行了\+代表至少一个*代表可以没有,或者有多个[]范围内只要满足一个即可[^]不在范围内的所有的都符合条件\{n,m\}至少满足n个,至多m个。.代表任意字符
实际上sed主要是用来处理文本文件的,所以大部分命令是对行操作的。
n禁止input stream的输出。p打印匹配行s/regexp/replacement/替换模式d删除指定行=输出行号a追加内容i插入内容q匹配的第一个完成后退出r从一个文件读内容并添加到最后R从一个文件读取内容
例如下面的例子
cat input | sed -n '1p' #输出第一行
cat input | sed -n '$=' #输出最后一行行号
cat input | sed -n '/3/'p #打印含有3的行
cat input | sed -n '1~2'p #打印奇数行
cat input | sed '2,2'd #删除偶数行
cat input | sed '5,7 s/^/\t/' #5至7行缩进
理论知识:
-i 参数用于修改文件。
s/// 用于替换内容
for f in $(grep -r -l "../../suanfa_xiaomiquan.jpg" .)
do
sed -i 's/..\/..\/suanfa_xiaomiquan.jpg/\/images\/suanfa_xiaomiquan.jpg/' $f
done
这个问题的关键步骤是: 获得文件列表, 提取前缀, 一个一个copy.
- rename命令
最简单的方式应该是复制到其他地方, 然后使用 [rename][] 命令.
cp *.html ./test/;
cd test;
rename .html .php *.html
cp *.php ../;
- xargs命令
直接复制并重名名, 这就需要使用 xargs 命令了.
ls -1 *.html | sed "s/.html//" | xargs -i cp {}.html {}.php
- 循环
当然我们也可以使用循环一个一个重命名.
find *.html | while read i
do
preFile=`echo "$i" | sed "s/.html//"`
cp $preFile.html $preFile.php
done
这里我希望在所有文件的前面追加一行内容.
find *.html | while read i
do
preFile=`echo "$i" | sed "s/.html//"`
cat $preFile.html | sed "1 i \<?php require_once(\"./check_login.php\"); ?>" > $preFile.php
done
这里有这样的文本
年 条件
2016 c_year:2016
2015 c_year:2015
2014 c_year:2014
2013 c_year:2013
2012 c_year:2012
2011 c_year:2011
2010 c_year:2010
2009 c_year:2009
2008 c_year:2008
2007 c_year:2007
2006 c_year:2006
2005 c_year:2005
2004 c_year:2004
2003 c_year:2003
其他 !c_year:2016,2015,2014,2013,2012,2011,2010,2009,2008,2007,2006,2005,2004,2003
希望使用脚本生成sql格式插入到表中.
表有一个自增id
'自增id','年','编号','条件','创建时间','修改时间','0','空'
cat in.txt | \
awk 'BEGIN{ id=1177 } { print id,$1,NR,$2; id++ } END{ }' | \
sed "s/^\([0-9]\+\) \([^ ]\+\) \([0-9]\+\) \(.\+\)/'\1','\2','\3','\4','','',0,''/"
cat in.txt | \
awk 'BEGIN{ id=1177;out="" } { out=out"+"id; id++ } END{ print out }'
cat all.json | sed 's/"stat"/\n/g' | grep -E "question__title_slug" | sed 's/^.*"question__title_slug": "\([^"]\+\)".*"frontend_question_id": \([0-9]\+\).*$/\1 \2/'
参考资料 sed 学习笔记