sed与awk用法对比总结
命令格式:
sed [选项] ‘定址 操作’ 文件 # ’定址 操作’合称’命令’(command)
awk [选项] ‘pattern {action}’ 文件
简单的多操作格式:
sed [选项] ‘定址 操作; 操作’ # 第2个操作对所有输入行都执行
awk [选项] ‘pattern {action; action}’
嵌套格式:
sed [选项] ‘定址 {定址 操作}’
awk [选项] ‘pattern {if() 执行语句}’ # if()的执行语句如果超过一句就要用{}括起来
sed 重点:
1. 正则表达式分隔符,默认是斜杠/,若要改变,如c,则只要在这个字符前加一个反斜杠\ +正则+c,例子:
sed -n '\cREcp' filename 等同于sed -n '/RE/p' filename
好处:c顶替斜杠成为分隔符,便于在正则表达式中包含斜杠(无需转义)。
3. 定址可以是:数字(代表行数,$表示最后一行)、正则表达式或2者的结合
4. sed的一层命令里只能有一个定址,如果嵌套了一层命令,则又有了一个定址。
5. sed里有模式空间(pattern space)和暂存缓冲区
6. 无论sed命令位于bash交互模式还是sed脚本里,对空格都不用转义(也可以转义),如:s/ /X/g 等同于s/\ /X/g 都是将空格转为X
7. -n选项的man解释:If auto-print is not disabled, print the pattern space
8. label功能很好很强大,主要配合N命令进行操作
9. sed里定址和操作都可以用正则
10. 行处理时,sed工作原理(不考虑暂存缓冲区与N、n等命令):
a) 从标准输入或文件中读入一行,存入模式空间(pattern space)中,存的时候不存\n
b) sed依据命令对其进行处理
c) 将处理完的打印出来,并在末尾加上\n,shell遇到\n就自动换行
使用N的时候情况如下: a) 从标准输入或文件中读入一行,存入模式空间(pattern space)中,存的时候不存\n
b) sed依据命令对其进行处理,遇到N命令时,在模式空间的末尾加上\n,然后将下一行读入进来,追加在刚添加的\n后面,此时模式空间的末尾依然没有\n(至始至终就不会有)
c) 将处理完的打印出来,shell遇到\n时候就自动换行,并在末尾加上\n
11. 详细笔记(未整理)
awk 重点:
1. UNIX.Shell 6.1 第3段的第2行(如果只„„)很重要!
awk '//' names 只给出模式,而未指定动作
awk '{print $0}' names 只指定动作,而未定义模式
以上2种输出结果一样 = cat names
2. “模式表达式中暗含着if语句。如果模式表达式含有if的意思,就不必用花括号把它括起来。当if是显式地给出时,这个表达式就成了操作语句。”(来源于UNIX.Shell 4th 6.7.1第一段)
3. 操作如果紧跟在某个模式后面(即该操作属于该模式),它的第一个左花括号就必须与该模式同处一行(包括shell交互模式下、shell脚本模式下与awk脚本中都要这样!)模式永远不会出现在花括号中。
4. 无论是在shell交互模式下还是awk脚本中,在行末尾用\都表示转义换行符,即下一行是直接接到这一行中,而action里,每个action之间用分号隔开或者换行符隔开
5. UNIX.Shell的6.19.1的第一句话(“next语句从输入文件中取出下一行输入,然后从awk脚本的顶部重新开始执行”)要注意:指的是立即跳过当前行(也不执行next分号后的语句),然后从输入文件中取出下一行,从awk脚本的顶部重新开始执行。BEGIN{}只会在未读任何行时候被执行,之后绝对不会再执行,即使有next。BEGIN放置的位置不影响执行效果,如果BEGIN块出现2个,就会按照脚本文件内容的前后顺序分别执行这2个BEGIN(切记1个BEGIN块至始至终会且只会被执行一次,END块是同样的道理)
6. match函数返回正则表达式在字符串中出现的位置,如果未出现,则返回0.match函数把内置变量RSTART设为子串在字符串中的起始位置,RLENGTH则设为子串的长度。这些变量可以被substr函数用来提取相应模式的子串.
7. 经过match()后,内置变量RSTART和RLENGTH就自动被赋值以匹配词的起始位置和匹配词的长度
8. awk的函数功能像其他语言一样,可以传递参数,返回值
9. 如果环境变量LANG=en_US.UTF-8则默认的RHEL5的GNU awk,关于sub()函数和gsub()函数的正则大小写敏感问题,核心在于locale。解决方法是LANG=C
10. 详细笔记(未整理)
sed与awk的重点比较:
1. “在命令行键入命令时,shell会设法对任何元字符和空格进行转换,sed命令中的任何可能被转换的字符都必须使用引号括起来。”(来源于UNIX.Shell 4th P105页脚部分)此句同样适用于所有shell下的所有工具,包括awk。
2. 返回退出状态:sed、awk均只当语法错误时候,才返回非0,只要语法正确,无论是否匹配,都返回0
3. sed,如果没有没有定址,sed将处理输入的所有行;但是不能只定址而不操作。
awk,如果没有pattern,awk将处理输入的所有记录;没有action,将打印匹配的记录。
4. sed的打印命令是p,awk的是print、printf等。
5. sed和awk的命令外都要加单引号’
6. 读入文件或从标准输入读入时,都是一行一行地读入,然后操作该行,然后读入下一行,而不会一段一段地读入
7. 大小写转换
sed转换大小写字母方法1:
sed -n '1,3{y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;p}'
将1-3行的小写字母替换成大写字母,并且打印1-3行。
sed -n '1,3{y/ABCDEFGHIJKLMNOPQRSTUVWX/abcdefghijklmnopqrstuvwxyz/;p}'
将1-3行的大写字母替换成小写字母,并且打印1-3行。
sed转换大小写字母方法2:
sed 's/.*/\L&/' 将大写字母替换为小写字母
sed 's/.*/\U&/' 将小写字母替换为大写字母
awk实现大小写转换,可以用toupper(string)、tolower(string)函数来实现,前者将小写->大写,后者将大写->小写
linux中文件内容替换的方法
linux中文件内容替换的方法
Linux中文件内容替换的方法
在Linux操作系统中,文件内容替换是一项常见的操作。当我们需要将文件中的特定内容进行替换时,可以使用一些命令和工具来实现。本文将介绍几种常用的方法来进行文件内容替换。
一、sed命令替换文件内容
sed命令是一个强大的文本处理工具,可以用来进行文件内容的替换。其基本语法如下:
sed 's/old/new/g' file
其中,old表示需要被替换的内容,new表示替换后的内容,g表示全局替换,file表示需要进行替换的文件名。
例如,我们有一个名为test.txt的文件,内容如下:
This is a test file. It is a good file.
现在我们想将其中的"good"替换为"great",可以使用以下命令:
sed 's/good/great/g' test.txt
执行该命令后,test.txt文件的内容会变为:
This is a test file. It is a great file.
二、grep命令替换文件内容
grep命令是一个用于查找文件中匹配的模式的工具,但它也可以用来进行文件内容的替换。其基本语法如下:
grep -rl old directory | xargs sed -i 's/old/new/g'
其中,old表示需要被替换的内容,new表示替换后的内容,directory表示需要进行替换的目录。
例如,我们有一个名为test.txt的文件,内容如下:
This is a test file. It is a good file.
现在我们想将其中的"good"替换为"great",可以使用以下命令:
grep -rl good /path/to/directory | xargs sed -i
's/good/great/g'
执行该命令后,目录中所有含有"good"的文件都会被替换为"great"。
Linux三剑客详解(grep、sed、awk)
Linux三剑客详解(grep、sed、awk)
前⾔
在Linux的学习和使⽤当中,⼈们常常提到的三剑客其实指的是grep、sed、awk这三个命令的简称,当熟练掌握了这⼏个命令,可以极⼤的提升运维效率。在讲到这三个命令之前,我们得先了解什么是正则表达式,正则表达式是学习三剑客的基础和前提。
⼀、正则表达式
正则表达式:Regular Expression,描述了⼀种字符串匹配的模式(pattern),可以⽤来检查⼀个串是否含有某种⼦串、将匹配的⼦串替换或者从某个串中取出复核某个条件的⼦串等。
标准正则表达式:
元字符:
. 匹配任意单个字符 [] 匹配指定范围内的任意单个字符 [^] 匹配指定范围外的任意单个字符
字符集合:
[:alnum:] 代表英⽂⼤⼩写字符及数字,亦即 0~9、A~Z、a~z [:alpha:] 代表任何英⽂⼤⼩写字符,亦即 A~Z、a~z [:blank:] 代表空格键与[tab]按键两者 [:cntrl:] 代表键盘上⾯的控制按键,包括CR、LF、Tab、Del等 [:digit:] 代表数字⽽已,即 0~9 [:graph:] 除了空格符(空格键与[tab]按键)外的其他所有按键 [:lower:] 代表⼩写字符,即 a~z [:print:] 代表任何可以被打印出来的字符 [:punct:] 代表标点符号(punctuation symbol),亦即 : " ' ? ! ; : # $ [:upper:] 代表⼤写字符,即 A~Z [:space:] 代表会产⽣空⽩的字符,包括空格键、[tab]、CR等 [:xdigit:] 代表⼗六进制的数字类型,因此包括 0~9、A~F、a~f 的数字与字符 匹配次数(贪婪模式):
* 匹配其前⾯的字符任意次 ? 匹配其前⾯的字符0次或者1次 + 匹配其前⾯的字符⾄少1次 .* 任意长度的任意字符
位置锚定:
^ 锚定⾏⾸,此字符后⾯的任意内容必须出现在⾏⾸ $ 锚定⾏尾,此字符后⾯的任意内容必须出现在⾏尾 ^$ 空⽩⾏
《shell编程指南》读书笔记(三)——文本处理(正则表达式,grep,awk,sed)
《shell编程指南》读书笔记(三)——文本处理(正则表达式,grep,awk,sed)
文本处理(一)
本文主要讲述正则表达式,grep,awk,sed命令。
3个命令都是针对行进行处理的。
grep: 主要用来进行字符串在文件中的搜索。
示例: grep -l "hello" test_file
awk : 主要用来进行格式化的文件中的域分割及处理。
示例:awk -F : ' { print $1,$6} ' /etc/passwd
sed : 主要用来对文件中的字符串修改,比如替换字符串。
示例:在整行范围内把字符 22 替换为 kokotest,如果没有g标记,则只有每行
第一个匹配的 22 被替换成 kokotest,-i选项指定对输入文件处理。
sed -i 's/22/kokotest/g' /root/soft/iptables
第7章 正则表达式
当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式(RE:Regular Expression),
正则表达式是一些特殊或不很特殊的字符串模式的集合。
本章设计的基本元字符使用在grep和sed命令中,同时结合{ \ \ }(以字符出现情况进行匹配 的元字符)使用在awk语言中。
基本元字符集及其含义
^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-
表示[ ]内字符序列范围,如用[ 1-5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有
特殊含义。\可以使其失去应有意义
. 只匹配任意单字符
pattern \ { n \ } 只用来匹配前面pattern出现次数。n为次数
pattern \ { n,\ } m 只含义同上,但次数最少为n
pattern \ { n,m \ } 只含义同上,但pattern出现次数在n与m之间
sed与awk(第二版)学习笔记
sed与awk(第二版)学习笔记 版本状态: V1.0 文档状态: 初稿版 修订日期: 2012年06月19日 文档信息: 项目名称 文档名称 《sed与awk(第二版)学习笔记.doc》 文件编号 项目等级 项目经理 项目阶段 文档维护信息: 修 订 人 修 订 日 期 修 订 说 明 版 本 号 张宇 2012.6.19 初稿 V1.0 ©版权所有 若非作者授权,不得引用本文档或本文档中的任何部分。 sed与awk(第二版)学习笔记
未经许可 不得引用、翻印 Page 1 of 142 目 录 前言 .......................................................................................................................................................... 7 第一章 强大的编辑工具............................................................................................................................ 7 1.1 字符流编辑器 .............................................................................................................................. 7 1.2 模式匹配的程序设计语言 ............................................................................................................ 7 1.3 掌握sed和awk的四个障碍 ....................................................................................................... 7 第二章 了解基本操作 ............................................................................................................................... 8 2.1 使用行编辑器ed的基本操作 ...................................................................................................... 8 2.1.1 删除 .................................................................................................................................. 8 2.1.2 替换 .................................................................................................................................. 8 2.2 命令行的语法 .............................................................................................................................. 9 2.3 使用sed ...................................................................................................................................... 9 2.3.1 替换字符串 ....................................................................................................................... 9 2.3.2 多重指令格式 .................................................................................................................. 10 2.3.3 脚本文件 ......................................................................................................................... 10 2.3.4 阻止输入行的自动显示 ................................................................................................... 11 2.4 使用awk ................................................................................................................................... 11 2.5 同时使用sed和awk ................................................................................................................. 12 第三章 了解正则表达式语法 ................................................................................................................... 14 3.1 引语 .......................................................................................................................................... 14 3.2 表达式....................................................................................................................................... 14 3.3 元字符汇总 ............................................................................................................................... 15 3.3.1 . ....................................................................................................................................... 15 3.3.2 * ....................................................................................................................................... 16 3.3.3 […] .................................................................................................................................. 17 3.3.4 ^ ...................................................................................................................................... 17 3.3.5 $ ...................................................................................................................................... 18 3.3.6 \{n,m\} .............................................................................................................................. 18 3.3.7 \ ....................................................................................................................................... 19 sed与awk(第二版)学习笔记
Linux命令行中的文件查找和替换技巧
Linux命令行中的文件查找和替换技巧
在Linux系统中,命令行是进行各种操作和管理的重要工具。文件查找和替换是经常需要用到的功能之一。本文将介绍几种常用的Linux命令行中的文件查找和替换技巧,帮助您更加高效地完成各种任务。
一、文件查找
1. find命令
find命令是Linux系统中最常用的文件查找命令之一。它可以通过指定条件在指定路径下查找文件。下面是find命令的基本语法:
find [路径] [选项] [条件]
例如,要在当前目录下查找所有以.txt为后缀的文件,可以使用以下命令:
find . -name "*.txt"
该命令中,"."表示当前目录,"-name"表示按名称进行查找,"*.txt"表示文件名称以.txt结尾。
2. locate命令
locate命令可以在存储文件路径的数据库中快速定位文件。不同于find命令需要遍历整个文件系统,locate命令通过搜索数据库来实现更快的查找速度。以下是locate命令的基本语法:
locate [选项] [搜索模式] 例如,要查找所有以.txt为后缀的文件,可以使用以下命令:
locate "*.txt"
该命令会列出所有满足条件的文件路径。
3. grep命令
grep命令主要用于在文件中查找指定的字符串模式。它可以通过正则表达式进行高级的模式匹配。以下是grep命令的基本语法:
grep [选项] [搜索模式] [文件]
例如,要在当前目录下的所有文件中查找包含“hello world”的行,可以使用以下命令:
grep "hello world" *
该命令会在当前目录下的所有文件中查找并显示包含指定字符串的行。
二、文件替换
1. sed命令
sed命令是一个用于文本替换的强大工具。它可以通过正则表达式进行模式匹配,并对匹配的行进行替换操作。以下是sed命令的基本语法:
sed 's/原始字符串/替换字符串/' 文件 例如,要将文件中所有的“apple”替换为“orange”,可以使用以下命令:
Linux主要shell命令、sed、awk详解
1 1 Linux主要shell命令详解
shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。
什么是shell
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。
shell 首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序, 如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令 不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给 Linux内核。
shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。
Linux文本三剑客超详细教程---grep、sed、awk
Linux⽂本三剑客超详细教程---grep、sed、awk
awk、grep、sed是linux操作⽂本的三⼤利器,合称⽂本三剑客,也是必须掌握的linux命令之⼀。三者的功能都是处理⽂本,但侧重点各不相同,其中属awk功
能最强⼤,但也最复杂。grep更适合单纯的查找或匹配⽂本,sed更适合编辑匹配到的⽂本,awk更适合格式化⽂本,对⽂本进⾏较复杂格式处理。
1、grep1.1 什么是grep和egrep
Linux系统中grep命令是⼀种强⼤的⽂本搜索⼯具,它能使⽤正则表达式搜索⽂本,并把匹配的⾏打印出来(匹配到的标红)。grep全称是Global Regular
Expression Print,表⽰全局正则表达式版本,它的使⽤权限是所有⽤户。
grep的⼯作⽅式是这样的,它在⼀个或多个⽂件中搜索字符串模板。如果模板包括空格,则必须被引⽤,模板后的所有字符串被看作⽂件名。搜索的结果被送到
标准输出,不影响原⽂件内容。
grep可⽤于shell脚本,因为grep通过返回⼀个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的⽂件不存在,
则返回2。我们利⽤这些返回值就可进⾏⼀些⾃动化的⽂本处理⼯作。
egrep = grep -E:扩展的正则表达式 (除了\< , \> , \b 使⽤其他正则都可以去掉\) 1.2 使⽤grep1.2.1 命令格式grep [option] pattern file 1.2.2 命令功能
⽤于过滤/搜索的特定字符。可使⽤正则表达式能多种命令配合使⽤,使⽤上⼗分灵活。 1.2.3 命令参数
常⽤参数已加粗
-A:除了显⽰符合范本样式的那⼀列之外,并显⽰该⾏之后的内容。
-B:除了显⽰符合样式的那⼀⾏之外,并显⽰该⾏之前的内容。
-C:除了显⽰符合样式的那⼀⾏之外,并显⽰该⾏之前后的内容。
-c:统计匹配的⾏数
-e :实现多个选项间的逻辑or 关系
AWK、SED、CUT及其他知识
本文命令已在AIX系统中验证。
AWK-扫描文件中每一行
逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕)
输出使用 {print }
1,输出某一列,print $列号
awk ‘{print $1}’文件名输出文件中每一行的第一列
awk ‘{print $1 $3}’文件名输出文件中每一行的第一列和第三列
{print $0}与{print}不做限制,输出所有
2,对行内容转换,print 字符
awk '{print “A”}’文件名
将每一行内容使用A进行替换
awk '{print 5}' 文件名
将每一行内容使用5进行替换
数字不需引号,其余字符需要引号。
指定不同的分隔符,如分隔符不为空格使用-F指定
awk -F”:”‘{print $1 $3}’文件名
使用冒号作为新的分隔符。
awk -F'[:\t]' '{print $1,$3}' 文件名
使用冒号或空格作为分割符,其中 \t 表示TAB键 ,\n表示换行、回车。
如需在输出时修改每一列信息
如修改为第一列XX 第二列XX 第三列XX
awk -F":" '{print "1st:" $1 "\t2nd:" $2 "\t3rd:"$3}' 文件名
表示在第一列前加上 1st:第二列前加上2nd: 第三列前加上3st:
原文件内容
A:a:1
B:b:2
C:c:3 D:d:4
E:e:5
F:f:6
输出如下:
1st:A 2nd:a 3rd:1
1st:B 2nd:b 3rd:2
1st:C 2nd:c 3rd:3
1st:D 2nd:d 3rd:4
1st:E 2nd:e 3rd:5
1st:F 2nd:f 3rd:6
使用\n效果如下:
awk -F":" '{print "1st:" $1 "\n2nd:" $2 "\n3rd:"$3}' awk1
Linux 三剑客实例详解
Linux 三剑客实例详解「grep、sed 、awk」
简介
Linux 操作文本的三大利器分别是 grep、sed 、awk,简称三剑客。
大师兄 awk:最擅长取列;二师兄 sed:最擅长取行;三师兄 grep:最擅长过滤。
正则表达式
大师兄 -- AWK
awk 是对文本进行格式化的工具,适合处理比较复杂的格式处理。
有多个版本: 1、new awk: nawk ;2、gawk, awk
awk 命令格式:
awk [options] 'script' file1 file2, ...
awk [options] 'PATTERN {acticon}' file1 file2, ...
格式说明:
pattern部分决定动作语句何时触发及触发事件:BEGIN、END
action 对数据进行处理,放在{}内指明:print、printf
最常用的是 print,默认以空白字符分隔
$0 代表整行,$1 代表第 1 段,$2 代表第 2 段,以此类推,$NF 代表最后一个字段,多个字段直接用逗号隔开
awk '{print $1, $2}' xxx.log
打印操作支持拼接打印,如:awk '{print "first" $1, $2}' xxx.log
4. options 参数:输入分隔符,默认以空白字符分隔,通过 -F 选项来执行分隔符
awk -F '#' '{print $1,$2}' test
输出分隔符,默认情况下输出分隔符是空格,使用内置变量 OFS 来设定输出分隔符,需要加上 -v 选项
awk -v OFS="-->" '{print $1,$2}' test
5. awk 变量
FS:输入字段分隔符,默认空白字符,一般需要加 -F
OFS:输出字段分隔符,默认是空格,一般需要加 -v
NF:分隔后的字段数量
Sed、Awk单行脚本快速参考
文本间隔:
# 在每一行后面增加一空行
sed G
awk '{printf("%s\n\n",$0)}'
# 将原来的所有空行删除并在每一行后面增加一空行。
# 这样在输出的文本中每一行后面将有且只有一空行。 sed '/^$/d;G'
awk '!/^$/{printf("%s\n\n",$0)}'
# 在每一行后面增加两行空行 sed 'G;G'
awk '{printf("%s\n\n\n",$0)}'
# 将第一个脚本所产生的所有空行删除(即删除所有偶数行) sed 'n;d'
awk '{f=!f;if(f)print $0}'
# 在匹配式样“regex”的行之前插入一空行 sed '/regex/{x;p;x;}'
awk '{if(/regex/)printf("\n%s\n",$0);else print $0}'
# 在匹配式样“regex”的行之后插入一空行 sed '/regex/G'
awk '{if(/regex/)printf("%s\n\n",$0);else print $0}'
# 在匹配式样“regex”的行之前和之后各插入一空行 sed '/regex/{x;p;x;G;}'
awk '{if(/regex/)printf("\n%s\n\n",$0);else print $0}'
编号:
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
# (tab,见本文末尾关于’\t’的用法的描述)而不是空格来对齐边缘。 sed = filename | sed 'N;s/\n/\t/'
awk '{i++;printf("%d\t%s\n",i,$0)}'
# 对文件中的所有行编号(行号在左,文字右端对齐)。 sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
