리눅스 sed 명령어 사용법 질문입니다.

seren0924의 이미지

sed를 사용해서 Lastname Firstname 이런 것을 Firstname Lastname 이렇게 변경할려고 합니다.

정규표현식을 사용해서 sed 's/^\([A-Z][A-Za-z]*\), \([A-Z][A-Za-z]*\)/\2 \1/' filename 이렇게 사용하라고 나와있는데.. 도통이해가 안가서요.
그냥 간단하게 Lastname Firstname 이걸로는 어떻게해야하나요? 제가 리눅스 초보라 헤매고있네요ㅠㅠ

dgkim의 이미지

정규식에서 괄호로 싸면, 대치시 \1, \2 형태로 참조하여 받을 수 있습니다.
그러므로, 두 단어을 찾아서 순서를 바꾸므로 뒤에 '\2 \1' 형태로 대치한 것입니다.

s는 대치를 의미하는 명령입니다. /1/2/ 형태로 사용하며, 1을 찾아서 2로 바꾼다는 의미입니다.

[A-Z] 형태는 대문자로 시작한다는 것을 나타내는 기호. (문맥상)
+
[A-Za-z] 형태는 영문자를 나타내는 기호.
+
* 형태는 앞의 문자가 반복됨을 나타내는 기호.
= 영문자 대문자로 시작하여, 대소문자 영문자를 포함하는 것이 연속된 것을 찾는다.

중간에 ,문자는 어떤 의미인지? ',' 문자 자체를 나타낼 것 같습니다.

정규식에서 정규식 자체 기호를 입력할 때, \문자를 사용합니다.(여타 많은 언어에서 escape sequence로 부르는 기호)

--
http://www.dgkim.net/

seren0924의 이미지

여러가지 방법을 찾아서 보니까
cat dog cat dog 이렇게 문자열이 있을때
sed s/\(cat\)\(dog\)/\2\1 filename

이렇게하면
dog cat dog cat 이렇게 swap 된다고하는데.. 그래서 해봤더니 안되더라구요. 제가 명령어를 잘 못 쓴건가요?

dgkim의 이미지

원래 질문에서와 같이 sed의 s/에서 시작하는 부분에서 ' 따옴표로 감싸서 해주십시오.
그리고, 끝나는 부분을 표시해 주어야 합니다. 즉, s/../../

완성해 보면 아래와 같습니다.

sed 's/\(cat\)\(dog\)/\2\1/'

그리고, cat dog을 붙여서 찾기 했으므로, 실제로는 아래와 같이 공백이 들어가야 합니다.

sed 's/\(cat\) \(dog\)/\2 \1/'

--
http://www.dgkim.net/