Unix 将新行转换为由空行分隔的文本块中的空格
我有一个文件如下。 数据块以区域开始,行块后始终有一个水平空白,即一个空行 foo.txtUnix 将新行转换为由空行分隔的文本块中的空格,unix,awk,sed,Unix,Awk,Sed,我有一个文件如下。 数据块以区域开始,行块后始终有一个水平空白,即一个空行 foo.txt 我想把它打印在下面——从区域字开始,直到空白行将该行转换成并排打印。 zone name Z_ZEBRA_TIGER vsan 900 * fcid 0x801e00 [device-alias TEST] * fcid 0x3d8b40 [device-alias TIGER1] * fcid 0x3d8bc0 [device-alias TIGER2] * fcid 0x3d8b60 [dev
我想把它打印在下面——从区域字开始,直到空白行将该行转换成并排打印。
zone name Z_ZEBRA_TIGER vsan 900 * fcid 0x801e00 [device-alias TEST] * fcid 0x3d8b40 [device-alias TIGER1] * fcid 0x3d8bc0 [device-alias TIGER2] * fcid 0x3d8b60 [device-alias CAT]
zone name Z_chili_yahoo vsan 100 * fcid 0x801400 [device-alias chilli] * fcid 0x803500 [device-alias yahoo]
zone name Z_tom_tommy vsan 100 * fcid 0x801400 [device-alias toma] pwwn 0x803460 [device-alias tommya]
我试着用tr,运气不好。有人能帮忙吗?
通过sed或awk实现此目的的任何简单方法。使用awk
工作原理
使用空行作为记录分隔符-v RS=”“
在输入时使用换行符作为字段分隔符-F'\n'
使用空格作为输出的字段分隔符-v of s=”“
这会将第一个字段设置为等于自身。这会发出信号表明线路已更改,这将导致awk在输出时用新的磁场分离器替换旧的磁场分离器$1=$1
打印记录打印
打印。因此,上述命令在功能上等同于:
awk -v RS="" -F'\n' '{$1=$1}1' foo.txt
使用sed
这会立即读取整个文件。如果输入文件太大(内存太大),请使用awk解决方案
工作原理
:a;N、 美元!ba代码>
这会立即读取整个文件
s/\n//g代码>
这将用空格替换所有换行符
s/zone name/\nzone name/g
这会在短语区域名称
的任何出现之前添加一个换行符
使用awk
工作原理
-v RS=”“
使用空行作为记录分隔符
-F'\n'
在输入时使用换行符作为字段分隔符
-v of s=”“
使用空格作为输出的字段分隔符
$1=$1
这会将第一个字段设置为等于自身。这会发出信号表明线路已更改,这将导致awk在输出时用新的磁场分离器替换旧的磁场分离器
打印
打印记录
缩略形式
正如Jotne所指出的,可以制作一个简短的表单。首先,因为输出字段分隔符在默认情况下是一个空格,所以我们不需要显式设置它。其次,可以使用隐式打印。因此,上述命令在功能上等同于:
awk -v RS="" -F'\n' '{$1=$1}1' foo.txt
使用sed
这会立即读取整个文件。如果输入文件太大(内存太大),请使用awk解决方案
工作原理
:a;N、 美元!ba代码>
这会立即读取整个文件
s/\n//g代码>
这将用空格替换所有换行符
s/zone name/\nzone name/g
这会在短语区域名称
的任何出现之前添加一个换行符
和塞德
-n
:仅按需打印
/^$/代码>:如果不是白线
H
:将行追加到缓冲区
$!b
如果不是文件的结尾(最后一行),处理循环脚本(用下一行重新启动)
s/*/;x
;清空当前行并将其与缓冲区交换
s/;s/\n//g
:删除第一个字符(第一个附加中的新行),并将所有新行更改为空格
p
:打印结果并循环到下一行
和塞德
-n
:仅按需打印
/^$/代码>:如果不是白线
H
:将行追加到缓冲区
$!b
如果不是文件的结尾(最后一行),处理循环脚本(用下一行重新启动)
s/*/;x
;清空当前行并将其与缓冲区交换
s/;s/\n//g
:删除第一个字符(第一个附加中的新行),并将所有新行更改为空格
p
:打印结果并循环到下一行
Perl:
perl -00 -nE 's/\n/ /g; say' foo.txt
-00
一次读取一个段落的文件
Perl:
perl -00 -nE 's/\n/ /g; say' foo.txt
-00
一次读取一个段落的文件
很好的解释。$1=$1
特别微妙。OFS
是默认的一个空格,因此可以省略:awk-v RS=“”-F'\n'{$1=$1}1'文件
假设没有(像在示例中一样,似乎不太确定)区域名称
作为别名设备说明。$1=$1
特别微妙。OFS
是默认的一个空格,因此可以省略:awk-v RS=“”-F'\n'{$1=$1}1'文件
假设没有(像在示例中一样,似乎不太确定)区域名称作为别名设备
sed -n '/^$/!{H;$!b
}
s/.*//;x;s/.//;s/\n/ /g;p' YourFile
perl -00 -nE 's/\n/ /g; say' foo.txt