使用 grep 和 sed 進行 bash

使用 grep 和 sed 進行 bash

這是我們每週的練習,沒有評分或等級(我們甚至沒有得到答案!)

如果有人有時間幫忙向我解釋這項練習,我將非常感激,因為我正試圖在周末完成這項工作,並且要到下週才能得到導師的幫助。我做了很多關於 bash 程式設計、正規表示式和 grep 的閱讀和工作。但下面的程式碼讓我感到困惑。

我什至想知道,說明是否不完整,或者我只是不明白?

具體來說,以下幾點阻礙了我理解整件事情:

NAMES=`ls *.$1`

filed=$(file:$1).$2

練習 4.3
假設給你一個文字檔(稱為 myfile),其中包含以下內容

#!/bin/bash

NAMES=`ls *.$1`

for file in $NAMES; do
    filed=$(file%:$1).$2
    mv file filed
done

執行下列指令 $ grep ' file ' myfile

 $ grep 'file*' myfile

 $ grep '^ *file*' myfile

 $ grep 'file$' myfile

 $ sed 's/ file* / script /g' myfile

 $ sed ' /for/,/files/d' myfile

 $ sed '/\$[A-Z]..[A-Z]*/d' myfile

然後解釋輸出或結果

答案1

NAMES=`ls *.$1`

這是一個任務。該變數$NAMES被分配了一個值。該值被視為反引號中命令的輸出(請參閱 中的命令替換man bash)。$1是一個特殊參數,它對應於腳本的第一個參數。因此,似乎腳本應該以擴展名作為參數運行(例如./script.sh txt),ls命令的輸出將儲存在變數中。

filed=$(file%:$1).$2

這實在是太奇怪了。事實上,您確定括號不是大括號嗎?並且也應該有 a.代替:.

filed=${file%.$1}.$2

${var%pattern}從變數末端剪切模式。man bash詳細資訊請參閱參數擴充。因此,在這種情況下,它會刪除點加上第一個參數給出的擴展名,並添加一個點和第二個參數。

順便說一句,移動線可能應該是

mv $file $filed

否則就沒有理由使用循環。

相關內容