3

バックグラウンド

送信する前に、# TODO出力されたいくつかのpythonソースコードファイルからコメントを削除したいと考えています。git archiveさまざまな* nix OSから実行されるスクリプトからそうするつもりなので、可能な限りPOSIXに準拠する必要があります。

基本仕様に含まれていないことは承知していfind -print0ますxargs -0が、それらは十分に一般的であるように思われるため、それらを使用しても問題ありません (より良い代替手段が存在しない限り)。インプレース編集の基本仕様にないedため、使用しています。sed -i以下のコマンドが、既に untar された 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'ヒアドキュメントが適用されていると思いますが、それを修正する方法がわかりません。xargsed

4

1 に答える 1

1

<< 'EOF'ヒアドキュメントの方向を修正するには、sh -cさらに多くの問題を引き起こすいくつかのトリックが必要になるため、ヒアドキュメントをまったく必要とせずに問題に再度アプローチしようとしました。

私は最終的に着陸しました:

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 $@ be the original command
    shift
    # Send original file contents to stdin, output to temp file
    "$@" < "$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技術的には基本仕様には含まれていませんが、かなり移植性があるように見えるので、含めても問題ありません。もいくつかの問題を引き起こしていたので、カスタム関数にed戻って、インプレース操作の使用不可フラグを複製しました。sed-i

于 2015-05-04T17:37:32.527 に答える