문서 내용:
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
.
두 번째 + 매개변수는 간단합니다.문서 저장.
임의의 텍스트 형식이 덜 규칙적인 경우(또는 정규식을 선호하는 경우) 다음을 사용할 수 있습니다.:substitute
주문하다:
vim +'%s/num2=\zs\d\+/\=submatch(0) + 5' +wq file
이는 명령을 사용하여 :substitute
부품을 다음으로 교체합니다.N
num2=N
기존 가치게다가 5개.