2008-12-05 37 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在行尾添加換行符。在打印結束之前,換行符會重新附加。