2014-06-08 93 views
0

之間我有一個文本文件,這樣更換到另一種模式,一切:猛砸從圖案中

  1. 目錄測試/劇場1
  2. Quote1 -RW-RW-R-- 63 1 1
  3. @
  4. 目錄測試/電影2
  5. Quote2 -rw-RW-R-- 24 2 1
  6. @
  7. ...(文件變亮)

我想這樣的輸出:

  1. 目錄測試/劇場1
  2. Quote1 -RW-RW-R-- 63 1 1
  3. @
  4. ...

我已經嘗試過這個命令:

sed '0,/'"Test\/Quote1"'/d;/@/,$d' header.txt 

,但它並沒有給我所需的輸出。 感謝您的幫助

編輯:

我試圖重現一些shell命令如果鍵入

rm Test/Movie2 

我的腳本是格式化文件「header.txt」 類似的東西:

while read -a line 
do 
if [[ "${line[0]}" == "rm" ]]; then 
    sed -i "/${line[1]}/"'s/.*//' header.txt #replacing Test/Movie2 by blank line 

done 

現在,我想用空行代替所有的東西在「目錄測試/電影2」,直到下一個分隔符「@」

+2

有許多方法來產生從給定的輸入端,輸出端,包括剛纔打印這些硬編碼線。如果您需要幫助,請告訴我們您的實際轉換算法。發佈不符合你想要的腳本並不能告訴我們你想要什麼。 –

+0

我編輯了我的帖子,希望我明確自己。 – debas

回答

1

根據您的sed的表情,我覺得那是你想用的是:

sed '/Test\/Movie2/,/@/d;' header.txt 

在換句話說:從Test/Movie2@(含)。它提供了你想要的輸出。

編輯:上面的命令將完全刪除模式之間的線條。

這裏是另一個命令行,這將,而是用空行替換它們:

sed '/Test\/Movie2/,/@/g;' header.txt 

(而不是刪除圖案d命令並打印什麼的,我們加載和sed保留空間,打印內容這是空的。)

+0

而不是刪除行我想用空行替換它們 – debas

+0

對不起,我錯過了。我編輯了我的答案以糾正它。 – Qeole

+0

這確實比我的更優雅。恭喜。 –

0

後首次發現@這將只打印空白行(它給了我展現在您的文章,但我想它不是你想要的)

awk 'f {$0=""} /@/ {f=1} 1' file 
directory Test/Movie1 
Quote1 -rw-rw-r-- 63 1 1 
@ 



. 

.只是爲了讓這個頁面顯示空行。

0

你可以嘗試這樣的:

#!/bin/bash 

IN_FILE="test.txt" 

remove(){ 
    [[ $1 ]] || error 
    awk -v dir="$1" 'BEGIN{np=0; w=0} 
    ($2 == dir){np=1; w=0} 
    (np == 1 && $0 == "@"){np=0; w=1} 
    {if(np == 0 && w == 0){print $0} else {print ""; w=0}}' "$IN_FILE" 
} 

bye(){ 
    echo "Bye..." 
    exit 0 
} 

error(){ 
    echo "Invalid command" >&2 
} 

while true; do 
    read -rp "> " command 
    set -- "$command" 
    case "$1" in 
     rm) remove "$2" ;; 
     exit) bye ;; 
     *) error ;; 
    esac 
done 

示範:

$ cat test.txt 
directory Test/Movie1 
Quote1 -rw-rw-r-- 63 1 1 
@ 
directory Test/Movie2 
Quote2 -rw-rw-r-- 24 2 1 
@ 
$ ./test.sh 
> rm something 
directory Test/Movie1 
Quote1 -rw-rw-r-- 63 1 1 
@ 
directory Test/Movie2 
Quote2 -rw-rw-r-- 24 2 1 
@ 
> rm Test/Movie1 



directory Test/Movie2 
Quote2 -rw-rw-r-- 24 2 1 
@ 
> rm Test/Movie2 
directory Test/Movie1 
Quote1 -rw-rw-r-- 63 1 1 
@ 



> exit 
Bye... 
0

如果我正確地理解了你,以「目錄」開頭並以「@」結尾的每一行代表一條記錄,並且您希望能夠從該目錄中刪除一條記錄(一組行)通過指定在該行上的「目錄」之後出現的文件。

如果名爲「電影」環境變量包含要刪除什麼,這將輸出同樣的名單上沒有你指定的影片記錄:

movie="Test/Movie2" 
sed -r ":a;N;\$!ba;s~(\n?)directory ${movie}\n[^@]*@\n?~\1~" < header.txt 

相反,如果你想修改該文件的地方,你可以用「-i」:

movie="Test/Movie2" 
sed -r -i ":a;N;\$!ba;s~(\n?)directory ${movie}[^@]*@\n?~\1~" header.txt 

我用一個符號(〜),而不是通常的正斜槓(/)將託換組分分離,以防止在電影記錄的任何斜槓(如「測試/ Movie2「)從困惑sed。而且,「s〜」之前的內容使sed將整個文件視爲單行,以允許在換行符中查找和替換。

注意這隻適用於GNU sed,就像在Linux中常見的那樣。如果您在OS X或BSD,sed中較爲有限,所以你可以安裝GNU sed或使用:

movie="Test/Movie2" 
tr "\n" "\177" < header.txt \ 
| sed -E "s~("$'\x7F'"?)directory ${movie}"$'\x7F'"[^@]*@"$'\x7F'"?~\1~" \ 
| tr "\177" "\n" 
+0

是的,這幾乎是我想要做的。實際上,我想用空行代替這些行而不是刪除它們。 – debas

+0

每個記錄總是會有三行,就像在你的例子中那樣,或者它是每個記錄的可變行數? –

+0

它是可變數量的線。這裏的常數是總是有一個「@」作爲分隔符 – debas