‘sed’를 사용한 추가 리디렉션 , 파일 열기, 작업 수행,

로 수학 연산을 수행하려고 sed하지만 변수를 문자열로 계속 처리합니다. 입력은 다음과 같습니다.

$ echo 12 | sed 's/[0-9]*/&+3/'
$ 12+3

출력으로 15를 갖고 싶습니다. 파이썬 데몬으로 프로그램을 실행하고 있기 때문에 작업을 수행하고 수학 결과를 한 번만 대체해야하며 stdout파일 리디렉션 , 파일 열기, 작업 수행, 결과 추출, 수행 과 같은 구절을 피하고 싶습니다. 대체품. 나에게 sed한 줄로 모든 것을 수행하는 것이 가장 좋습니다.

입력과 출력을 모두 다양한 방법으로 캐스팅하려고했습니다.

$ echo 12 | sed 's/[0-9]*/int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'

그러나 결과는 항상 두 번째 필드의 인쇄였습니다.



답변

정직하게 sed를 사용하려면 다음과 같이하십시오.

s/[0-9]/<&/g
s/0//g; s/1/|/g; s/2/||/g; s/3/|||/g; s/4/||||/g; s/5/|||||/g; s/6/||||||/g
s/7/|||||||/g; s/8/||||||||/g; s/9/|||||||||/g
: tens
s/|</<||||||||||/g
t tens
s/<//g
s/+//g
: minus
s/|-|/-/g
t minus
s/-$//
: back
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/; s/||||||||/8/; s/|||||||/7/; s/||||||/6/; s/|||||/5/; s/||||/4/
s/|||/3/; s/||/2/; s/|/1/
s/</|/g
t back

입력:

1+2
100+250
100-250

산출:

3
350
-150

당신의 임무는 그것을 받아들이기로 선택하면 곱셈을 구현하는 것입니다.


답변

sed여기서 가장 좋은 옵션은 아니지만 기본적으로 산술을 수행하지 않습니다 ( 가능한 방법 은 숫자 증가 참조 ). 당신은 그것을 할 수 있습니다 awk:

$ echo 12 | awk '{print $0+3}'
15

사용하는 가장 좋은 코드는 입력의 정확한 형식과 숫자가 아니거나 두 개 이상의 숫자가 포함 된 경우 수행하려는 작업에 따라 다릅니다.

당신은 또한 다음과 bash같이 할 수 있습니다 :

$ echo $(( $(echo 12) + 3 ))

또는 expr비슷한 방식으로 사용합니다.


답변

@Richter의 도전을 받아들이려고했습니다. 이것은 코드의 일부를 사용하여 수행 한 것입니다.

sed 's/[0-9]/<&/g
s/0//g; s/1/|/g; s/2/||/g; s/3/|||/g; s/4/||||/g; s/5/|||||/g; s/6/||||||/g
s/7/|||||||/g; s/8/||||||||/g; s/9/|||||||||/g
: tens
s/|</<||||||||||/g
t tens
s/<//g
s/.*\*$/0/
s/^\*.*/0/
s/*|/*/
: mult
s/\(|*\)\*|/\1<\1*/
t mult
s/*//g
s/<//g
: back
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/; s/||||||||/8/; s/|||||||/7/; s/||||||/6/; s/|||||/5/; s/||||/4/
s/|||/3/; s/||/2/; s/|/1/
s/</|/g
t back'

입력:

04*3
4*3
40*3
42*32
150*20
1*3
3*1
0*3
3*0

출력 : 모든 올바른 결과


답변

perl매우 유사한 구성을 허용합니다 sed… 한 가지 차이점은 perl더 복잡한 일 을 할 수 있다는 것입니다 … sed간단한 텍스트 인쇄물에 매우 좋습니다

 echo 'a12' | perl -pe 's/([0-9]+)/($1+3)/e'  # the trailing /e means evaluate

산출

a15


답변

그냥 문자열을 계산기에 넣습니다

 echo 12 | sed 's/[0-9]*/&+3/' | bc


답변

나는 정말로 아래의 대답 중 하나가 당신이 원하는 것을 받아들이는 이유가 무엇인지 이해하지 못합니다.

echo 12 | sed 's/[0-9]*/echo \$(( & + 3 ))/e'

또는

echo 12 | sed 's/[0-9]*/expr & + 3/e'

GNU sed가 필요할 수도 있지만 확실하지 않습니다.


답변

정규식과 산술 연산을 확실히 결합해야하는 경우 정규식의 대체 매개 변수가 콜백 함수가 될 수있는 언어를 선택하십시오.

Perl, Ruby, JavaScript 및 Python은 다음과 같은 언어입니다.

bash-4.2$ echo 12 | perl -pe 's/\d+/$&+3/e'
15

bash-4.2$ echo 12 | ruby -pe '$_.sub!(/\d+/){|s|s.to_i+3}'
15

bash-4.2$ echo 12 | js -e 'print(readline().replace(/\d+/,function(s){return parseInt(s)+3}))'
15

bash-4.2$ echo 12 | python -c 'import re;print re.sub("\d+",lambda s:str(int(s.group(0))+3),raw_input())'
15