sedを使用して2番目のパターン発生位置に行を挿入する

sedを使用して2番目のパターン発生位置に行を挿入する

次の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

関連情報