Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将新行转换为由空行分隔的文本块中的空格_Unix_Awk_Sed - Fatal编程技术网

Unix 将新行转换为由空行分隔的文本块中的空格

Unix 将新行转换为由空行分隔的文本块中的空格,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

我有一个文件如下。 数据块以区域开始,行块后始终有一个水平空白,即一个空行

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 [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=”“

    使用空格作为输出的字段分隔符

  • $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

    这会在短语
    区域名称
    的任何出现之前添加一个换行符

使用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