ID:= "abc123" のすべてを検索したいテキスト ファイルがあります。そのファイルで、abc123 の値を取得して新しい行を作成し、文字列 newId:= "abc123 を設定する必要があることがわかりました。ターミナル内でこれを行いますか?
bash を使用したいと思います。以下にいくつかの例を示します。文字列 '"ID": " を見つけ、値 (abc123) をコピーし、このデータで新しい行を作成します。
"ID": "abc123"
"newID": "abc123"
あなたはこれを行うことができます:
sed -e 's/^"ID": "\(.*\)"/&\
"newID": "\1"/' myfile.txt
まず、一致を検索する正規表現について説明します。
^
行頭に一致"ID": "
その正確な文字列に一致\(.*\)
*
任意の文字 ( )の 0 個以上 ( ) のシーケンスに一致します.
。この式をバックスラッシュ付きの括弧の間に配置すると、「キャプチャ」が作成され、一致の結果の部分を補助変数に格納できます\1
。"
二重引用符に一致一致するものが見つかったら、次のものに置き換えます。
&
試合そのもの。この演算子は、一致したものを表す補助変数です。\<new-line>
バックスラッシュの後に実際の改行文字が続くと、改行がエスケープされます。改行文字を置換に出力できます"newId": "
その正確な文字列を出力します\1
キャプチャの内容を出力するので、見つかった ID を出力します"
二重引用符文字を出力します。これが役立つことを願っています=)
これをやってみてください:
sed -r 's@^"ID": "([a-Z0-9]+)"@"newID": "\1"@' file.txt
sed
: 実行可能ファイル-r
: 拡張モード (バックスラッシュ括弧は必要ありません)s
: 置換を実行します。スケルトンはs@origin@replacement@
(区切り文字は何でもかまいません)^
:正規表現の行頭を意味します( )
: 括弧はキャプチャです"newID":
新しい文字列の始まりです\1
: 置換された文字列 (キャプチャされた文字列) の末尾です。あなたの質問が非常に漠然としていることを考慮して、実装で明らかになるいくつかの仮定を立てました。
入力ファイル -- t と呼ぶ
ID="one"
dkkd
ID="two"
ffkjf
ID="three"
ldl
入力ファイルで実行されたコマンド
for line in `cat t`; do newID=`echo $line | grep ID | cut -d= -f2`; if [[ "$newID" != "" ]]; then echo $line >> t2; echo newID=$newID >> t2; else echo $line >> t2; fi; done
出力ファイル -- 名前は t2 (コマンドから明らか)
ID="one"
newID="one"
dkkd
ID="two"
newID="two"
ffkjf
ID="three"
newID="three"
ldl
基本的に、このコマンドはファイル (この場合は t と呼ばれる) の行ごとに ID 行を探します。値を取得する行が見つかった場合は、ID を含む元の行を出力し、その直後に newID が続く別の行を出力します。問題の行に ID がない場合は、行自体を出力するだけです。
注意事項:
ファイルに「ID」が含まれているが、要求した通常の ID ではない行が他にある場合、これは機能しません。