0

ID:= "abc123" のすべてを検索したいテキスト ファイルがあります。そのファイルで、abc123 の値を取得して新しい行を作成し、文字列 newId:= "abc123 を設定する必要があることがわかりました。ターミナル内でこれを行いますか?

bash を使用したいと思います。以下にいくつかの例を示します。文字列 '"ID": " を見つけ、値 (abc123) をコピーし、このデータで新しい行を作成します。

"ID": "abc123"
"newID": "abc123"
4

3 に答える 3

4

あなたはこれを行うことができます:

sed -e 's/^"ID": "\(.*\)"/&\
"newID": "\1"/' myfile.txt

まず、一致を検索する正規表現について説明します。

  1. ^行頭に一致
  2. "ID": "その正確な文字列に一致
  3. \(.*\)*任意の文字 ( )の 0 個以上 ( ) のシーケンスに一致します.。この式をバックスラッシュ付きの括弧の間に配置すると、「キャプチャ」が作成され、一致の結果の部分を補助変数に格納できます\1
  4. "二重引用符に一致

一致するものが見つかったら、次のものに置き換えます。

  1. &試合そのもの。この演算子は、一致したものを表す補助変数です。
  2. \<new-line>バックスラッシュの後に実際の改行文字が続くと、改行がエスケープされます。改行文字を置換に出力できます
  3. "newId": "その正確な文字列を出力します
  4. \1キャプチャの内容を出力するので、見つかった ID を出力します
  5. "二重引用符文字を出力します。

これが役立つことを願っています=)

于 2012-10-18T16:34:42.090 に答える
1

これをやってみてください:

sed -r 's@^"ID": "([a-Z0-9]+)"@"newID": "\1"@' file.txt
  • sed: 実行可能ファイル
  • -r: 拡張モード (バックスラッシュ括弧は必要ありません)
  • s: 置換を実行します。スケルトンはs@origin@replacement@(区切り文字は何でもかまいません)
  • ^:正規表現の行頭を意味します
  • ( ): 括弧はキャプチャです
  • "newID":新しい文字列の始まりです
  • \1: 置換された文字列 (キャプチャされた文字列) の末尾です。
于 2012-10-18T16:22:14.657 に答える
-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 ではない行が他にある場合、これは機能しません。

于 2012-10-18T16:21:39.990 に答える