HEAD
セクションが終了する前にHTMLファイルにテキストを挿入する必要があります。
私はしようとしています:
sed -i "s#</head>#<style> @page { prince-shrink-to-fit: auto }
.repository-with-sidebar.with-full-navigation .repository-content
{width: 950px ! important;} </style>\n</head>#" ${1}"/"${2}"/"${i}.html
エラーが発生します:
sed: 1: command a expects \ followed by text
エラーが表示されません。スタイルを一重引用符で囲んでみました。
HEAD
セクションの終わりの前に挿入したい正確なテキストは次のとおりです。
<style>
@page { prince-shrink-to-fit: auto }
.repository-with-sidebar.with-full-navigation .repository-content
{width: 950px ! important;}
</style>
編集:正確なコマンドは次のとおりです。
sed -i "s#</head>#<style> @page { prince-shrink-to-fit: auto } .repository-with-sidebar.with-full-navigation .repository-content {width: 950px ! important;} </style>\n</head>#" ${1}"/"${2}"/"${i}.html
編集2:コマンドを正しくフォーマットしていることを確認するために、これも試しています。
strToInsert='<style> @page { prince-shrink-to-fit: auto } .repository-with-sidebar.with-full-navigation .repository-content {width: 950px ! important;} </style>'
sed -i "s#</head>#$strToInsert\n</head>#" ${1}"/"${2}"/"${i}.html
これにより、挿入するテキストに問題がある可能性があることに気付きます。
インプレースsed
では、プロセス中にバックアップファイルを作成する必要があります。 Appleのsed
の-i
オプションには拡張子引数が必要です (作成するバックアップファイル用)そして次の引数を消費します。つまり、拡張子が「#s</head>#...
」のバックアップファイルを作成するように指示しているということです。
エラーは、あなたが a
ppendコマンド を参照していると考えていることを意味します。 $1
の値はa
で始まると推測します。 -i
は前の引数を食べたので、sed
はこれが変更するファイルへのパスではなく、実行するスクリプトであると考え、それに応じてエラーが発生します。これは、Apple sed
および無効なa
コマンドで発生するエラーです。
$ sed a sed: 1: "a": command a expects \ followed by text
sed
コマンドで-i
に拡張引数を指定します。
sed -i.bak "s#</head>#<style> @page { prince-shrink-to-fit: auto } .repository-with-sidebar.with-full-navigation .repository-content {width: 50px ! important;} </style>\n</head>#" "${1}/${2}/${i}.html"
そして物事は機能します(ただし、\n
は改行エスケープではないことに注意してください)。一重引用符を使用する場合は、「!important
」からスペースを削除することもできます。
上記はGNU sed
でも機能しますが、 -i
はPOSIXオプションではありません であり、一般的に移植性がないことに注意してください。
とにかくインプレース変更を使用せず、ファイルのコピーを自分で明示的に処理することをお勧めします。しかし、それはあなた次第です。
変数展開${1}
などを引用する必要があります。スラッシュのみを引用することは、それらが常にリテラルであるため、無意味です。
申し訳ありませんが、あなたの声明を読んでいますHEADセクションの終わりの後に挿入したい正確なテキストは...最初は私たちが追加について話していると信じさせました前に挿入するのではなく、テキストをファイルセクションに挿入するので、最初にその回答を書きました。質問を読み直し、例のsed
コマンドを詳しく調べた後、これは本当に一致する前にテキストを挿入することだと理解していると思います。その答えは今ここにもあります-あなたはどちらかのことをするための以下の指示を見つけるでしょう。
i
nsertまたはa
ppendを使用して、行の先頭/末尾に任意の文字列を安全にsed
ppするために、いくつかのオプションがあり、それぞれが最後よりも複雑です。
最初の-そしてすべての中で最も単純な-はr
eadコマンドです。エスケープは必要ありません。たとえば、追加したい文字列がファイル./append
にある場合は、次のようにすることができます。
sed '\|</head>|r ./append' <infile >outfile
または、それを挿入するにはahead一致の1サイクル前に、次のような少し先読みで印刷することができます。
sed -e '$!N;\|\n</head>|r ./insert' -e 'P;D' <infile >outfile
しかし、r
eadはstdoutに書き込むように指定されています-そして、それが-i
nplaceオプションでどのように機能するかはわかりません(これは私の意見ではほとんど醜いハックです、とにかく)。 I 仮定sed
はp
rintと同じことを行い、stdoutをその名前の-i
nplace編集ファイルにリダイレクトする必要があります。
もう1つのオプションは、a
ppendコマンドを使用することです--- for appendingつまり。これを安全に行うには、\n
ewlinesとバックスラッシュをエスケープするだけで済みます。あなたはこれを次のようにするかもしれません:
printf %s\\n "$str_to_append" |
sed 's|\\|&&|g;$!s|$|\\|;1i\
\\|</head>|a\\' |
sed -f - infile >outfile
ただし、a
ppendはr
eadと同じように動作するように指定されているため、-i
n-placeハックでどのように動作するかはわかりません。
上記のa\\
をi\\
に置き換えると、テキストがi
nsertになります(または名前が-i
nplaceedit-file-実装で機能する場合) )前パターンスペースが書き出されます。
余分な作業が好きな場合は、(または、私が考えることができる唯一の実用的な用途では、特定の順序で1行に複数のr
eads/a
ppendsをスケジュールしています) =以前にr
eadで行ったのと同じ方法で、挿入にも使用できます。
printf %s\\n "$str_to_append" |
sed 's|\\|&&|g;$!s|$|\\|;1i\
\\|\\n</head>|a\\' |
sed -e '$!N' -f - -e 'P;D' infile >outfile
最後に提供するのは、&
と区切り文字(通常は/
)もエスケープする必要があることを除いて、ほぼ同じです。これは次のように機能します。
printf %s\\n "$str_to_append" |
sed 's|[\/&]|\\&|g
$!s|$|\\|;$s|$|/|
1i\
/<\\/head>/s/^/\\' |
sed -f - infile >outfile
これは挿入に影響します。文字列をそのように追加したい場合は、^
を$
と交換するだけです。
-i
オプションを追加するかどうかに関係なく、これでうまくいくと確信しています。
最後にもう1つ注意してください。ただし、-i
を使用する代わりに、次のことも行うことができます。
sed '$d;\|</head>|r ./append' <<IN >infile
$( cat <infile; echo .)
IN
...または、挿入の場合:
sed -e '$d;N;\|\n</head>|r ./insert' -e 'P;D' <<IN >infile
$( cat <infile; echo .)
IN
...これにより、-i
が影響する可能性があるため、意図しないアクセス許可が発生することなく、infileインプレースで編集されます。