2016-07-29 50 views
0

文件b.txt tar文件中的文本文件中的行包含線,如這些:在tar文件<code>b.tar</code>替換sed和正則表達式

dir1 => /dir1A 
dir2 => /dir2A 

我想一個簡潔的表達與替換它的tar文件中用這些來代替行版本:

dir1 = /dir1B 
dir2 = /dir2B 

的表達可能依賴於這樣一個事實:b.txt副本在同一目錄a.tar存在。我的sed技能有點生鏽。我已經嘗試了以下,但它還沒有工作。我的錯誤是什麼?有更簡潔的版本嗎?

tar df a.tar b.txt 
echo b.txt | 
    sed \#^dir1[ \t]*=>.*$#dir1 => /dir1B# | 
    sed \#^dir2[ \t]*=>.*$#dir2 => /dir2B# | 
    tar af a.tar - 
+1

所以'tar'文件並沒有真正進入到你的問題,因爲你有「聯合國」已經塗柏油?在sed中替換的正確語法是'sed'\#...#...#'file'(注意前導's'和單引號)。您也可以在一次調用中組合多個替換,例如'sed's \#...#...#; \#.. 2 ..#...#'(注意分隔命令的分號)。祝你好運; – shellter

回答

1

這(是少了幾分簡潔比我原本希望,但)顯然是卓有成效的:

TMP_DIR=`mktemp -d` 
cat b.txt | \ 
    sed 's#^\(dir1A\s*=\s*\)\(.*\)\(\s*\)$#\1/dir1B\3#' | \ 
    sed 's#^\(dir2A\s*=\s*\)\(.*\)\(\s*\)$#\1/dir2B\3#' > \ 
    $TMP_DIR/b.txt 
tar fv a.tar --delete ./b.txt 
tar fv a.tar -C $TMP_DIR --append ./b.txt 
rm -fr $TMP_DIR