2016-07-29 117 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