【问题标题】:Double Spacing Complex Sed Output双间距复杂 Sed 输出
【发布时间】:2010-09-25 11:30:23
【问题描述】:

首先让我说我知道可能有一种更简单的方法可以做到这一点。 但这就是我所拥有的,是的,希望我能在最后做出一些改进和/或简化。

目前的目标

要将存储在下面$tmp 变量中的输出加倍,并对每一行单独编号。这样做应该会在不同的行上为我提供每组可执行命令。

问题 1

我已经尝试了所有我能想到的将变量中的空间加倍的方法。移动双倍空格命令,并更改命令本身。

为我尝试修改此代码的文件编号:

 sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /

当然也尝试过 awk 但没有任何进展..

不是那么长期的目标

  • 一一执行这些命令并比较字节差异。或者只是任何一般的差异。我知道此时我可以将 diff 命令与file1 file2 一起使用,然后将输出保存在某个变量中,例如:"$diffA $diffB" 并每次使用循环更新它,以便有可能将超过 2 个文件作为参数传递。
  • 区分每个命令行。并回显如下内容:

file1 中的第 1 行与 file2 中的第 1 行不同,请查看:"$diffA $diffB"

这是我目前所拥有的,这是一个开始:

#!/bin/bash

FILE="$1"

echo "You Entered $FILE"

if [ -f $FILE ]; then

tmp=$(cat $FILE | sed '/./!d' | sed -n '/regex/,/regex/{/regex/d;p}'| sed -n '/---/,+2!p' | sed -n '/#/!p' | sed 's/^[ ]*//' | sed -e\
s/[^:]*:// | sed -n '/regex /!p' | sed -n '/regex /!p' | sed -n '/"regex"/,+1!p' | sed -n '/======/!p' | sed -n '/regex/!p' | sed -n '/regex\
\r/!p' | sed -n '/regex /!p' )

fi

MyVar=$(echo $tmp)

echo "$MyVar | sed G"

FILE2="$2"
if [ -f $FILE2 ]; then
    if [ -f $FILE2 ]; then
         tmp2=$(cat $FILE2 | sed -n '/regex/,/regex/{/regex\ S/d;p}' |\ 
sed -n '/#/!p' | sed -e s/[^:]*:// | sed /--------/,+10d)
     fi


echo "$tmp2"

非常感谢任何帮助。

【问题讨论】:

  • 除非您告诉我们实际的 输入 是什么样的,以及您最终想要实现的转换,否则您很可能找不到了解问题的人并且可以帮助你。就我而言,你在标题之后就失去了我。
  • 你也不应该发布phpBB [标签],它们在这里不起作用。使用编辑器上方的格式化按钮,花半分钟时间阅读编辑提示。
  • 我不知道你的输入是什么样的,也不知道你希望你的输出是什么样的。

标签: regex unix shell sed


【解决方案1】:

这可能对你有用:

a=$(printf "aaa %d\n" {1..5} | sed = | sed 'N;s/\n//;G')
echo $a
1aaa 1 2aaa 2 3aaa 3 4aaa 4 5aaa 5
echo "$a"
1aaa 1

2aaa 2

3aaa 3

4aaa 4

5aaa 5

解释:

  1. sed = 插入一个行号,追加一个换行符,然后追加一行
  2. sed 'N's/\n//;G' 追加一个换行符,读取另一行并追加它。 s/\n// 删除嵌入的换行符。 G 在行尾附加一个换行符。在周期结束时,会在打印之前重新附加一个换行符。

【讨论】:

    【解决方案2】:

    使用临时文件的替代方法是使用引号来禁止换行符/空格替换:

    tmp="$(echo a; echo b)"
    echo "$tmp"
    

    【讨论】:

      【解决方案3】:

      以下 awk 脚本将输出双倍间距并对行编号:

      awk ' { print NF " " $0; print ""; }'
      

      您的问题是将其分配给变量:

      ( echo a; echo b) | awk ' { print NR " " $0; print ""; }'
      

      给予:

      1 a
      
      2 b
      

      但是

      tmp=$(( echo a; echo b) | awk ' { print NR " " $0; print ""; }')
      echo "$tmp"
      

      给予

      1 a 2 b
      

      因为使用 $() 会将换行符替换为空格。您将不得不使用临时文件:

      tmp=$(mktemp)
      awk ' { print NR " " $0; print ""; }' $FILE > $tmp
      cat $tmp # Do something with the file
      rm $tmp # Don't forget to clean up after yourself.
      

      【讨论】:

        猜你喜欢
        • 2016-02-26
        • 2019-06-27
        • 2014-12-13
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        相关资源
        最近更新 更多