セクションが終了する前に、HTMLファイルにいくつかのテキストを挿入する必要がありますHEAD
。
私の考えでは:
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
これにより、私が挿入したテキストに問題がある可能性があることに気づきました。
答え1
内部プロセスsed
中にバックアップファイルを作成する必要があります。これ-i
Appleのオプションにはsed
拡張パラメータが必要です。(生成されたバックアップファイルの場合)次のパラメータを使用します。これは#s</head>#...
、拡張子が ""であるバックアップファイルを作成することを意味します。
エラーは、あなたが参照していると思うことを意味します。a
一時停止コマンド。私の推測値$1
はa
。-i
ateの前の引数は、sed
これが変更されるファイルのパスではなく実行されるスクリプトだと思うので、適切なエラーが発生します。これはまさにApplesed
と間違ったコマンドでa
発生するエラーです。
$ sed a sed: 1: "a": command a expects \ followed by text
-i
コマンドに拡張パラメーターを指定してくださいsed
。
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
。
sed
上記のコードはGNUでも動作しますが、注意してください。-i
POSIX オプションではありません。そして、一般的に持ち運びが簡単ではありません。
とにかく、内部修正を使用せずに明示的にファイルコピーを直接処理することをお勧めします。しかし、それはあなた次第です。
${1}
変数の拡張などを引用する必要があります。スラッシュは常にリテラルなので、単に引用することは意味がありません。
答え2
申し訳ありませんが、あなたの声明を読んでくださいHEADセクションの末尾に挿入する正確なテキストは次のとおりです。最初は、ファイルセクションにテキストを挿入するのではなく、ファイルセクションにテキストを追加することについて話していると信じていました。だから最初にこの答えを書きました。質問をもう一度読んで、例のsed
コマンドをさらに詳しく調べた後、これが実際に一致する前にテキストを挿入することを理解したと思います。したがって、この答えもここにあります。以下で行う手順を見つけることができます。
i
行の頭/尾部分にランダムな文字列を安全に挿入または追加するには、いくつかのオプションがあり、各オプションは最後のオプションよりも複雑です。a
sed
最初で最も簡単なのはr
eadコマンドです。エスケープはまったく必要ありません。たとえば、追加する文字列がファイルにある場合は、./append
次のようにします。
sed '\|</head>|r ./append' <infile >outfile
または挿入してください。最初マッチングプロセスでは、次のようないくつかのプレビュー機能を使用して、印刷する前に1サイクルを一致させることができます。
sed -e '$!N;\|\n</head>|r ./insert' -e 'P;D' <infile >outfile
しかし、eadはstdoutに書き込むように指定されました。これがnplaceオプションとr
どのように機能するのかわかりません。-i
(とにかく私の考えでは、これはほとんど醜いハッキングです)。私考えるrintと同じことをsed
行い、stdoutを名前付きnplace編集ファイルにリダイレクトする必要があります。p
-i
a
別のオプションは保留コマンドを使用することです。追加それは。この作業を安全に行うには、\n
行とバックスラッシュだけを外してください。次のことができます。
printf %s\\n "$str_to_append" |
sed 's|\\|&&|g;$!s|$|\\|;1i\
\\|</head>|a\\' |
sed -f - infile >outfile
a
しかし、pendの振る舞いはeadの振る舞いとして指定されているので、再びn-placeハッキングでどのように振る舞うかはr
わかりません。-i
a\\
上記を w/ に置き換えると、標準出力にテキストが挿入さi\\
れます。i
(または-i
nplace edit-fileで名前付け - 実装に適した場合) 今後パターン空間が記録される。
追加作業が好きなら、(または私が考えることができる唯一の実際の使用では、行ごとに複数のr
ead / pendを特定の順序でソートします。)a
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
これは挿入に影響を与えます。この方法で文字列を追加するには、単にaを^
aに置き換えます。$
-i
そのオプションを追加するかどうかにかかわらず、効果があると確信しています。
-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
影響を及ぼす可能性がある予期しない権限の問題なしに、すぐに編集できます。