2014-01-13 15 views
0

我打算創建一個簡單的腳本來根據存儲在屬性文件中的值編輯文件。 所以基本上我打算循環遍歷原始文件中的每一行,當它遇到一行內的某個標籤時,請說「/#」,它將獲得標籤後面的文本,即證書,然後實現一個函數來解析屬性文件來獲得特定的值並將它們添加到原始文件中。 因此,例如,文件將具有以下行:shell解析一行以查找某個標記

「/#證書」

我不知道如何最好地搜索標籤,我打算有一個,如果找到/#和然後拆分剩餘的文本以獲取字符串。

while read line 
    do 

    #need to parse line to look for tag 


    echo line >> ${NEW_FILE} 
    done < ${OLD_FILE} 

任何幫助將é不勝感激

================================= ====

編輯:

我的解釋有點差;道歉。我只是試圖獲取/#後面的文本 - 即我只想獲取它之前的字符串值。然後我可以根據文本的內容調用函數。

+0

您的問題已標記sh bash ksh - 是否意味着這些的「任何」或「全部」? – tripleee

回答

1

您可以使用正則表達式的BASH功能:

while read line 
do 
if [[ "$line" =~ ^.*/#certs(.*)$ ]]; then 
    # do your processing here 
    # echo ${BASH_REMATCH[1]} is the part after /#certs 
    echo echo ${BASH_REMATCH[1]} >> ${NEW_FILE} 
fi 
done < ${OLD_FILE} 
1

這是移植到Bourne shell的,因此,當然,KSH和Bash。

case $line in 
    '/#'*) tag="${line#/\#}" ;; 
esac 

把它放到一些上下文,這裏是如何使用它一個更現實的例子:

while read line; do 
    case $line in 
     '/#'*) tag="${line#/\#}" ;; 
     *) continue ;; # skip remainder of loop for lines without a tag 
    esac 
    echo "$tag" 
    # Or maybe do something more complex, such as 
    case $tag in 
     cert) 
      echo 'We have a cert!' >&2 ;; 
     bingo) 
      echo 'You are the winner.' >&2 
      break # terminate loop 
      ;; 
     esac 
done <$OLD_FILE >$NEW_FILE 
+0

不確定是否需要/有用反斜槓。 Bash可以使用或不使用它,但我懷疑其他shell可能需要它。 – tripleee

0

例如,你可以搜索字符串,並利用操縱他們一步到位sed流編輯器。

echo $line | sed -rn 's:^.*/#(certs.+):\1:p' 

這將只在相關行的/#之後打印相關部分。

+0

我試圖在/#ie之後獲得文本部分,我想獲得「certs」位 - 然後我將執行一個函數來根據文本的內容來執行某些操作。這仍然可能與sed? –

+0

'sed -n's%^ /#%% p'' – tripleee

+0

我修改了答案,以便sed僅打印'/#'後面的部分。 – SzG