2012-12-18 3 views
3

는 I는 file.txt를 상기 파일의 각 라인이 같다 배시 쉘 스크립트 문자열의 케이스 부분을 낮출 EY B AH L D을 또는 EY B AH L ER, 예를 들어 소문자로, 나머지는 대문자로 유지하십시오. 내가 어떻게 해?변환 문자열

대단히 감사합니다.

답변

6
while read first second; do 
    second=$(echo "$second" | tr [:upper:] [:lower:]) 
    printf '%s\t%s\n' "$first" "$second" 
done < file.txt 

출력 :

ABLED ey b ah l d 
ABLER ey b ah l er 
tr

변수에서 "소문자"플래그를 설정 호출하지 않고


다른 두 콘 셸에서 할 수있는 방법, pdksh 같은, 또는 배쉬 (콘 셸 호환 가능한 셸에만 해당) :

typeset -l second 
while read first second; do 
    printf '%s\t%s\n' "$first" "$second" 
done < file.txt 

가 (만 배쉬!) 배쉬의 경우-수정 매개 변수 확장 수정을 사용

while read first second; do 
    printf '%s\t%s\n' "$first" "${second,,}" 
done < file.txt 
+0

위대한! 고마워요! – user1835630

+0

+1. 나는 추가적인 해결책을 덧붙이는 자유를 취했다. –

+0

@glennjackman Nice. 나는 둘 다 내 솔루션보다 낫다. 나는 그 특징들 중 어느 것에 대해서도 몰랐다. –

0

파이썬 스크립트 : 그것은이 같은

import sys 
for l in sys.stdin.read().splitlines(): 
    try: 
     head,rest = l.split(' ', 1) 
     print head, rest.lower() 
    except: print l 

실행을 (당신이 filter.py라는 파일에 스크립트를 저장 가정) :

$ python filter.py < file.txt 
1

은 다음과 같은 매우 난독 화 스크립트를 사용하여 sed는 수행 할 수 있습니다 :

012,351을

스크립트 (h;s/ .*//;x;s/[^ ]* //)의 첫 번째 부분은 보류 영역에서 제 1 공간과 패턴 공간의 첫번째 공간 후에 라인의 일부 이전의 A 부분을두고 : 6,

sed -e 'h;s/ .*//;x;s/[^ ]* //;y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/;H;x;s/\n/ /' your_file 

를 설명 :

  • h : 보류 공간의 실제 줄을 복사합니다.
  • s/ .*// : 첫 번째 공백 앞에있는 문자 만 패턴 공간에 유지합니다.
  • x : 스위치 홀드 및 패턴 공간.
  • s/[^ ]* // : 첫 번째 공백 다음의 문자 만 패턴 공간에 유지합니다.

이제 우리는 홀드 공간에서 줄의 첫 번째 부분을 가지며 패턴 공간에서 두 번째 부분을 갖습니다. 우리는 두 번째 부분을 소문자로 넣어야하므로 y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/을 사용합니다 (예, 저는 AZERTY 키보드가 있습니다).

  • H : 공간을 보유 패턴 공간을 추가

    다음에, 함께 파일의 1, 2 부분을 다시 받고의 문제입니다.

  • x : 교환 패턴 공간 및 보유 공간.
  • s/\n/ / : H 명령의 \n을 공백으로 대체하십시오.

나는 당신이 sed synthax ;-)에 진절머리 나지 않기를 바랍니다. ,

paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]") 
0

당신은 그것을 읽기, 떠들썩한 파티를 사용하는 동안 파일이 변경되지 않습니다 알고있는 경우 연속적인 공간이 단일 분리기로 간주이 경우는 그대로

awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file 

필드 분리 단순히 " " 수 없습니다이 AWK 갖는 용액이다.

0

당신이 나오지 솔루션을보다 이해하기 파이프 작업 솔루션 (안 붙여 넣기 솔루션) 쉽게 원하는 경우

0

Linux 플랫폼에서 스크립트를 실행하려는 경우에도 스크립트 시작 부분에 #!/bin/ksh를 사용하십시오. 이 ksh는 HpUx 또는 Solaris에서 사용하는 모든 종류의 typeset 변수를 허용합니다.

+0

왜 이런 식으로 질문에 대답했는지 명확하지 않습니다. 전혀 읽었습니까? 주의 깊게 읽으십시오! – Trinimon