Linux에서 예상되는 하위 그룹 대신 Sed 교체 그룹이 OSX에 추가됩니다.

Linux에서 예상되는 하위 그룹 대신 Sed 교체 그룹이 OSX에 추가됩니다.

쉼표로 구분된 세 개의 열이 있습니다. 성, 이름, 사회적 이름.

성 열의 모든 문자를 대문자로 바꾸려고 합니다.

sed 's/\([^,]*\)/\U\1/' foo.file

osx에서 이 명령은 성 열을 대문자로 시작하는 대신 각 줄의 시작 부분에 대문자 U를 추가하지만 우분투 인스턴스에서는 예상대로 작동합니다.

왜 이런 일이 발생하는지 이해하지 못합니다.

매뉴얼 페이지에는 "멀티바이트 문자는 ''s'' 및 ''y'' 명령의 구분 기호로 사용할 수 없습니다. /가 멀티바이트 문자인지는 확실하지 않지만(그렇다고 생각하지 않음) 오류가 나열되어 있습니다. 구분 기호를 "i"로 바꾸면 같은 일이 발생하므로 문제가 되지 않습니다.

답변1

sed 'h;s/[^,]*,[^,]*,//
     y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
     H;x;s/[^,]*\n//

' foo.file

답변2

\U실제로 BSDism에서 영감을 받은 GNUism입니다. 이는 편집기 s의 해당 명령 ex(명령줄 모드 vi)에서 나온 것입니다.

OS/X는 AT&T의 저작권 문제 이후 처음부터 다시 작성된 sed4.4BSD에서 파생된 FreeBSD에서 파생되었을 가능성이 높습니다 . sed어떤 경우에도 BSD나 AT&T는 그들의 주문을 sed지원하지 않습니다 .\Us

휴대용 으로 대문자로 변환하려면 sed일반적으로 y다음 명령을 사용하십시오.이미 표시된 대로.

그러나 여기서는 더 나은 접근 방식을 사용할 수 있습니다 awk.

awk -F, -vOFS=, '{$1 = toupper($1); print}'

답변3

간단한 작업에는 필요하지 않습니다.sed

while IFS=',' read -r first mid last
do
    echo "$first, $mid, ${last^^}"
done < file_with_commas

버전이 변수 확장을 지원하지 않는 경우 bash다음을 사용할 수 있습니다.tr

last=$(echo $last | tr [[:lower:]] [[:upper:]])

답변4

/U 및 /L이 OSX/BSD sed에서 작동하지 않는 것 같습니다.

와 함께

sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping

감사합니다. 내 평판은 투표할 만큼 높지 않지만 Mike는 sed를 사용하여 내 문제를 해결했고 나도 Stephane의 의견에 동의합니다. awk가 더 나은 선택인 것 같습니다.

관련 정보