双间距复杂Sed输出

时间:2008-12-05 07:14:48

标签: regex unix shell sed

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

目前的目标

将下面$tmp变量中存储的输出加倍,并分别对每一行进行编号。这样做应该在不同的行上给我每组可执行命令。

问题1

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

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

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

当然,用awk进行了实验但没有进展..

不是那么长期目标

  • 逐个执行这些命令并比较字节差异。或者只是一般差异。我知道此时我可以使用带有file1 file2的diff命令,然后将输出保存在某个变量中,例如:"$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"

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

以下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.

答案 1 :(得分:0)

使用临时文件的另一种方法是使用引号来抑制换行/空格替换:

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

答案 2 :(得分:0)

这可能对您有用:

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在行尾添加换行符。在周期结束时,在打印之前重新连接换行符。