2008-12-05 67 views
0

让我开始说我知道可能有一个更简单的方法来做到这一点。 但是,这是我所拥有的,是的,希望我可以在最后做出一些改进和/或简化。Double Spacing Complex Sed输出

目标作为此时

要双空间存储在下面的$tmp可变输出的和单独地为每行编号。这样做应该为我提供每行可执行命令集。

问题1

我已经试过了我能想到的双空间什么是可变的一切。移动双空间命令,并更改命令本身。

为Number我试图修改此代码文件:

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

,当然还有使用awk,但没有取得任何进展实验各地..

并非如此长期目标

  • 要逐一执行这些命令并比较字节差异。或者只是任何一般的区别。我知道在这一点上,我可以使用file1 file2 diff命令,然后将输出保存在一些变量中,如:"$diffA $diffB"并每次使用循环更新它,以便有超过2个文件作为参数传递的机会。
  • 说出每个命令行之间的区别。和回声一样的东西:

在文件1线1在文件2,从1号线不同,检查出来:“$迪法$ 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" 

任何帮助非常感谢。

+0

除非您给我们一个关于实际*输入*的样子,以及最终要实现什么样的转换的想法,您很可能会发现没有人理解问题并可以帮助您。就我而言,在标题之后你已经失去了我。 – Tomalak 2008-12-05 08:34:30

回答

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. 
0

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

tmp="$(echo a; echo b)" 
echo "$tmp" 
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在行尾添加换行符。在打印结束之前,换行符会重新附加。