4

マークダウンに変換したい一連のテキスト ファイルがあります。先頭のスペースをすべて削除し、すべてのファイルの最初の行にハッシュ記号を追加したいと考えています。これを実行すると:

sed -i.bak '1s/ *\(.*\)/\#\1/g' *.md

最初のファイルの最初の行を変更してすべて処理し、残りのファイルは変更しません。

複数のファイルの n 行目にあるものを検索して置き換えるには何が欠けていますか?

OSX 10.7 で bash を使用する

4

3 に答える 3

5

問題は、デフォルトで sed が任意の数のファイルを 1 つのストリームとして扱うため、行番号のオフセットが最初のファイルの先頭に相対的であることです。

GNU sed の場合、 -s ( --separate) フラグを使用してこの動作を変更できます。

sed -s -i.bak '1s/^ */#/' *.md

...または、非 GNU sed (Mac OS X のものを含む) を使用すると、ファイルをループして、それぞれ 1 回呼び出すことができます。

for f in *.md; do sed -i.bak '1s/^ */#/' "$f"; done

ここでは、正規表現が少し単純化されていることに注意してください。変更しない行の部分を一致させる必要はありません。

于 2012-04-30T14:49:45.777 に答える
0
sed -rsi.bak '1s/^/#/;s/^[ \t]+//' *.md

コマンドの最後にg(lobally)は必要ありません。これは、行の先頭で何かを置き換える必要がなく、複数回ではないためです。

2つのコマンドを使用します。1つは1行目(1s ...)を変更するためのもので、2番目のコマンドとはセミコロンで先頭の空白(およびタブ?:= \ t)を区切ります。最初の行の空白を削除するには、順序を切り替えます。

sed -rsi.bak 's/^[ \t]+//;1s/^/#/' *.md

不要な場合は\tを削除してください。次に、グループも必要ありません。

sed -rsi.bak 's/^ +//;1s/^/#/' *.md

-rは、正規表現の特別な扱いを示すフラグです。その場合、プラスをマスクする必要はありません。

于 2012-04-30T17:12:33.437 に答える
0

XARgs はあなたのためにトリックを行います:

http://en.wikipedia.org/wiki/Xargs

sed コマンドの末尾から *.md を削除し、XArgs を使用してファイルを 1 つずつ収集し、単一のエンティティとして sed コマンドに送信します。申し訳ありませんが、解決する時間がありませんが、ウィキペディアの記事には、知っておくべきことが示されているはずです。

于 2012-04-30T14:50:16.247 に答える