我需要删除以下行以某些字符串开头的行末尾的回车符,并插入一些内容,例如将行开头的“and”更改为“and”,同时删除前面的换行符。
换句话说,我该如何改变这一点:
tomato
ham
and eggs
BLT
peanut butter
and jelly sandwich
进入这个?:
tomato
ham and eggs
BLT
peanut butter and jelly sandwich
答案1
使用sed
with-z
选项,使行由 NUL 字符分隔,然后更改匹配项,如下所示:
sed -z 's/\nand/ and/g' infile
一些sed
实现支持实际的新行,就像您可以执行的那样:
sed 's/
and/ and/g' infile
答案2
在 sed 中执行此操作的经典方法(不占用整个文件)是:
sed -e :a -e '$!N;s/\nand/ and/;ta' -e 'P;D' file
前任。
$ sed -e :a -e '$!N;s/\nand/ and/;ta' -e 'P;D' file
tomato
ham and eggs
BLT
peanut butter and jelly sandwich
参见示例Sed 单行解释,第一部分:文件间距、编号以及文本转换和替换,40. 如果前一行以等号“=”开头,则在前一行后面追加一行
答案3
$ awk 'function p() { if (hold != "") print hold } /^and/ { hold = hold OFS $0; next } { p(); hold = $0 } END { p() }' file
tomato
ham and eggs
BLT
peanut butter and jelly sandwich
这用于awk
将行累积到变量中,每当找到hold
以字符串开头的行时调用。and
如果当前行不以 开头and
,则打印累积行(如果有)并使用当前行重置hold
。