Sedは2つのパターン間のテキストを見つけて置き換えます。

Sedは2つのパターン間のテキストを見つけて置き換えます。

親愛なるStack Exchangeコミュニティの皆さん、

私は別の解決策を見ましたが、正規表現を使用するのが難しいので、これを私の状況に合わせて調整する必要があります。

置き換える必要があるlibオブジェクトのメンバー属性と名前を含むソフトウェア生成ファイルがあります。属性の名前を見つけてデフォルトのファイル名に置き換えるには、sedを使用する必要があります。

以下を含むbobby.jsという名前の.jsファイルで始まります。

// stage content:
(lib.Scenario2IntroFigure0 = function(mode,startPosition,loop) {
    stuff
}

同じbobby.jsファイルで終わりますが、今は次のようになります。

// stage content:
(lib.bobby = function(mode,startPosition,loop) {
    stuff
}

注:シーン2の紹介図0はいその他残念ながら、すべてのファイルについて。

私がしなければならないことを説明する類似コード:

A. 次のパターン間の項目を見つけて、前の名前を区切ります。

// stage content:
(lib.

B. このエンディングパターンは次のとおりです。

= function(mode,startPosition,loop) {

C. 次のコマンドを使用して、ファイルのデフォルト名自体を取得します。

FILENAME=$(basename $1 '.js')

D. 古い名前をファイルのデフォルト名に変更し、次のようにファイルを上書きします。

sed -i "s/Scenario2IntroFigure0/$DA_FILE/g" $1

ただし、「Scenario2IntroFigure0」は、sedがこれら2つのモードの間で見つけたものです。

答え1

$file次に置き換えてください$1

file="bobby.js"
filename=$(basename "$file" '.js')
sed -i 's/\((lib\.\).*\( = function(mode,startPosition,loop) {\)/\1'"$filename"'\2/' "$file"

答え2

GNU awkを使用してgensub()を実行します。

$ awk -v RS= '{ $0=gensub(/(.*\/\/\s+stage content:\s+\(lib\.)\S+(\s+=\s+function\(mode,startPosition,loop\)\s+\{.*)/,"\\1" gensub(/\.js$/,"",1,FILENAME) "\\2",1) } 1' bobby.js
// stage content:
(lib.bobby = function(mode,startPosition,loop) {
    stuff
}

awk -i inplace -v RS=...「所定の位置」を編集するには:

答え3

@Freddyで始まりますが、コンテストに合格するようOPの要求が含まれています。に交換して使用を\n完了してください。NULLsed

tr '\n' '\0'

その後、後でもう一度切り替えますsed

f="bobby.js"
b=$(basename "$f" '.js')
pre="// stage content:\x00\(lib."             #pattern includes NULL (\x00)
post=" = function\(mode,startPosition,loop\)"
cat $f | tr '\n' '\0' | sed -E "s|($pre)[[:alnum:]]+($post)|\1$b\2|g" | tr '\0' '\n'

編集する

sed混乱のない純粋なソリューションtr

f="bobby.js"
b=$(basename "$f" '.js')
pre="\/\/ stage content:"
mid="\(lib."
post=" = function\(mode,startPosition,loop\)"
sed -E "/^$pre$/{$!{ N;s|($pre\n$mid)[[:alnum:]]+($post)|\1$b\2|;ty;P;D;:y}}" $f

このソリューションの利点は次のとおりです。この投稿そしてこれ。私のようにたくさん読んでから、あなたの頭が痛くなければいいのですが、その過程で私は多くを学びました。 @Peter.Oを含むポスターを尊重してください。

私たちはそうしません!

PostScript

bobby.js開いた中かっこと閉じ中括弧が一致しないため、元の形式が正しくありません。

関連情報