文書の内容:
RANDOM TEXT num1=400 num2=15 RANDOM TEXT
RANDOM TEXT num1=300 num2=10 RANDOM TEXT
RANDOM TEXT num1=200 num2=5 RANDOM TEXT
次のように、各行の各num2に対して5を減算したいと思います。
RANDOM TEXT num1=400 num2=10 RANDOM TEXT
RANDOM TEXT num1=300 num2=5 RANDOM TEXT
RANDOM TEXT num1=200 num2=0 RANDOM TEXT
純粋なbashが好まれますが、他のGNUツールがより良い作業をしている場合は大きな問題ではありません。
答え1
使用awk
:
awk '{ for (i=1;i<=NF;i++) { if ($i ~ /num2=/) {sub(/num2=/, "", $i); $i="num2="$i-5; print} } }' file
次に、各行の各列を繰り返しながら、含まれている列を見つけますnum2=
。列を見つけたら、次の操作を行います。
num2=
削除 -sub(/num2=/, "", $i)
- 列を次のようにオーバーライドします
num2={oldnum-5}
。$i="num2="$i-5
- この行を印刷してください -
print
答え2
真珠:
perl -pe 's/(?<=num2=)(\d+)/$1 - 5/e' file
コンテンツをファイルに保存するには:
perl -i -pe ...
答え3
[ただもう少し仲良くしようとしています。ミラー- 異機種出力を得るには少しジャンプが必要です。:
$ mlr --fs ' ' --repifs --ocsvlite --headerless-csv-output put '
$num1 = "num1=".$num1; $num2 = "num2=".($num2-5)
' file
RANDOM TEXT num1=400 num2=10 RANDOM TEXT
RANDOM TEXT num1=300 num2=5 RANDOM TEXT
RANDOM TEXT num1=200 num2=0 RANDOM TEXT
入力が実際に一部の列にスペースを含めることができるTSVの場合
$ mlr --fs '\t' --ocsvlite --headerless-csv-output put '
$num1 = "num1=".$num1; $num2 = "num2=".($num2-5)
' file
RANDOM TEXT num1=400 num2=10 RANDOM TEXT
RANDOM TEXT num1=300 num2=5 RANDOM TEXT
RANDOM TEXT num1=200 num2=0 RANDOM TEXT
答え4
ビーム使用:
vim +'g/^/exe "norm! 3Wf=5\<C-A>"' +wq file
最初+
ディスカッション各行で一連の通常モード操作を実行して、数値を5倍に増やします。それ:global
コマンドはすべての行で実行されます。ただ使用:normal
と範囲 %norm
使用しないと簡単になります。CTRLA数値を増やしますが、この制御文字を(簡単に)Vimに渡すためにコマンドを実行する文字列として書き込みます。:execute
だから私たちは必要です:global
。
2番目の+パラメータは簡単です。文書を保存。
任意のテキスト形式があまり規則的でない場合(または正規表現を好む場合)、次のものを使用できます。:substitute
注文する:
vim +'%s/num2=\zs\d\+/\=submatch(0) + 5' +wq file
これはコマンドを使用して:substitute
部品を次のものに交換します。N
num2=N
既存の価値しかも5つ。