次の2つのコマンドラインセットがあります。
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes \
install install-lib
2行目の前に行を挿入したいですmake PREFIX=/usr
。
私が試したことは次のとおりです。
sed -e "/make PREFIX=\/usr/i\ sed -e '/\\\\\$(DIRINSTALL) -m 755 \\\\\$(DESTDIR)\\\\\$(SBINDIR)/ s/^/#/' \\\\\n\ -e '/\\\\\$(DIRINSTALL) -m 755 \\\\\$(DESTDIR)\\\\\$(LIBDIR)/ s/^/#/' \\\\\n\ -e 's/pci \\\\\$(DESTDIR)\\\\\$(PKGCFDIR)/pci/' \\\\\n\ -i Makefile" \
>> $Output
$Output
スクリプトファイルの名前です。
正しいsedコマンド(以下を参照)を生成しますが(一部の\ 'は表示から失われます)、もちろん2つのモードの上に行を配置します。上記のさまざまな改善を試しましたが、成功しませんでした。 2番目のアイテムの上にどのように挿入しますか?申し訳ありません。 Google ではまだ情報を提供していません。私はこれをBashスクリプトで書いているので、sedやawkを適用するのが最も簡単です。私はPerlを理解していないので、それを使用したくありません。
これが私が挿入したい行です。 Bashスクリプトでは、次のように表示する必要があります。
sed -e '/\$(DIRINSTALL) -m 755 \$(DESTDIR)\$(SBINDIR)/ s/^/#/' \
-e '/\$(DIRINSTALL) -m 755 \$(DESTDIR)\$(LIBDIR)/ s/^/#/' \
-e 's/pci \$(DESTDIR)\$(PKGCFDIR)/pci/' \
-i Makefile
答え1
これはうまくいきます...最初の発生をスキップします。
sed -i -E '0,/make PREFIX/! s/(make PREFIX)/\n\1/' file.txt
ファイル.txt
make PREFIX=/usr
SHAREDIR=/usr/share/hwdata
SHARED=yes
make PREFIX=/usr
SHAREDIR=/usr/share/hwdata
SHARED=yes
install install-lib
答え2
heredocs <<
コマンドラインで引用やバックスラッシュの問題を回避する非常に便利な方法です。
コードをsedに渡すと、最初のmakeコマンドを見つけて次のコマンドにジャンプします。この時点で挿入が完了し、その時点から他のものに気にすることなくeofに向かって滑ります。
sed -f - file <<\eof
/make PREFIX=\/usr/!b
:a;n;//!ba
i\
sed -e '/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(SBINDIR)/ s/^/#/' \\\
-e '/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(LIBDIR)/ s/^/#/' \\\
-e 's/pci \\$(DESTDIR)\\$(PKGCFDIR)/pci/' \\\
-i Makefile
:b;n;bb
eof
これは期待される出力に基づいています。
答え3
1つの方法は次のとおりですawk
。
awk '
index($0, "make PREFIX=/usr") && (++c == 2){
print "sed -e \047/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(SBINDIR)/ s/^/#/\047 \\"
print " -e \047/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(LIBDIR)/ s/^/#/\047 \\"
print " -e \047/s/pci \\$(DESTDIR)\\$(PKGCFDIR)/pci/\047 \\"
print " -i Makefile"
}
1 # print current line
' file
文字列がmake PREFIX=/usr
現在の行(インデックス> 0)に存在する場合、変数は事前にインクリメントされてc
比較されます2
。条件がtrueの場合、挿入する文字列を出力します。次に、現在の行を印刷します。一重引用符は8進数で書かれています\047
。
答え4
「make PREFIX」行の前の内容を置き換えるには、「contentneed_to_replace」変数を使用します。
for i in `sed -n '/make PREFIX/{;=;p}' o.txt| sed -n '1~2p'| sed -n '2p'`
do
contentneed_to_replace="praveen"
sed ''$i's/make PREFIX.*/'$contentneed_to_replace'\n&/g' o.txt
done
出力
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes
praveen
make PREFIX=/usr \
SHAREDIR=/usr/share/hwdata \
SHARED=yes \
install install-lib