文字列を抽出してbashで置き換える

文字列を抽出してbashで置き換える

次の文字列があります。func showFetchNextSliceFailed(result: UserResult<[Product]>) {

これから私は考える1)。 2)のみ抽出しますshowFetchNextSliceFailed。同様に、与えられた行のすぐ上に挿入します#Mark showFetchNextSliceFailed

  func showProductsList(result: UserResult<[Product]>) {

  }

  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

予想出力:

  #Mark showProductsList
  func showProductsList(result: UserResult<[Product]>) {

  }

  #Mark showFetchNextSliceFailed
  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

grepとsedを試しましたが、まだ文字列を抽出して置き換える方法を正しく理解できませんでした。

答え1

そしてsed

  • 一致するパターン空間をコピーして省スペース
  • パターン空間の変更
  • 予約済みスペースから元のコンテンツを復元して追加します。

前任者。

$ sed '/func show/ {h; s/func \(show[^(]*\).*/#Mark \1/; G;}' file
  #Mark showProductsList
  func showProductsList(result: UserResult<[Product]>) {

  }

  #Mark showFetchNextSliceFailed
  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

答え2

次のファイルがある場合code

入力する:

  $more code
  func showProductsList(result: UserResult<[Product]>) {

  }

  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

注文する:

perl -i.bak -pe "s/^^( *|\t*)func\s(\w+)func\s(\w+)/\1#Mark \2\n\1func \2/g" code

出力:

  #Mark showProductsList
  func showProductsList(result: UserResult<[Product]>) {

  }

  #Mark showFetchNextSliceFailed
  func showFetchNextSliceFailed(result: UserResult<[Product]>) {

  }

説明する:

  • -i.bakperl入力ファイルをバックアップするための内部モード
  • s/^( *|\t*)func\s(\w+)func\s(\w+)/\1#Mark \2\n\1func \2/gパターンの検索と置換の詳細は次の場所にあります。デモ

関連情報