2015-05-01 50 views
1

背景

我期待在發送之前去掉git archive輸出的一些python源代碼文件的任何# TODO評論。我期望從一個腳本中這樣做,它將從各種* nix操作系統運行,因此它應該儘可能符合POSIX標準。xargs如何使用heredocs?

我知道find -print0xargs -0不在基本規範中,但它們看起來很普遍,以至於我很好地使用它們(除非存在更好的替代方案)。我使用ed,因爲sed -i不在就地編輯的基本規範中。假設下面的命令正在從一個已經解壓tar的git壓縮文件的目錄運行。

我很樂意提供一個整體替代解決方案來剝離# TODO評論,但爲了滿足我的好奇心,我還想回答我遇到的特定問題,我用我提出的命令。

現有代碼

find . -type f -name "*.py" -print0 | xargs -0 -I {} ed -s {} << 'EOF' 
,g/^[ \t]*#[ \t]*TODO/d 
,s/[ \t]*#[ \t]*TODO// 
w 
EOF 

預期結果

在「py」爲結尾的文件都剝奪了全行僅包含TODO註釋,或的行末註釋以TODO開始。

實際結果

(標準輸出)

,g/^[ \t]*#[ \t]*TODO/d 
,s/[ \t]*#[ \t]*TODO// 
w 
: No such file or directory 

當前理論

我相信<< 'EOF'定界符被應用到xargs而不是ed,我不知道如何解決那。

回答

0

殺青<< 'EOF'定界符方向將採取一些弄虛作假sh -c該結束了,甚至造成更多的問題,所以我試圖重新接近的問題,而不需要here文檔可言。

我結束了登陸:

inline() { 
    # Ensure a file was provided 
    in="${1?No input file specified}" 
    # Create a temp file location 
    tmp="$(mktemp /tmp/tmp.XXXXXXXXXX)" 
    # Preserve the original file's permissions 
    cp -p "$in" "$tmp" 
    # Make [email protected] be the original command 
    shift 
    # Send original file contents to stdin, output to temp file 
    "[email protected]" < "$in" > "$tmp" 
    # Move modified temp file to original location, with permissions and all 
    mv -f "$tmp" "$in" 
} 

find . -type f -name "*.py" -exec grep -ilE '#[ \t]*TODO' {} \+ | while read file; do 
    inline "$file" sed -e '/^[ \t]*#[ \t]*TODO/ d' -e 's/[ \t]*#[ \t]*TODO//' 
done 

mktemp在技術上並不在基本規範,但appears to be fairly portable所以我很好,包括它。 ed也導致了一些問題,所以我回到sed用一個自定義函數複製不可用的-i標誌進行就地操作。