2017-10-08 10 views
2

모든 슬래시 '/'를 백 슬래시 '\'로 바꾸고 싶습니다.한 문자를 다른 문자로 바꾸거나 그 반대로 문자열을 바꾸십시오.

내 순진 솔루션은 tr이 작업을 수행하는 것입니다하지만 나는 아주 예쁜 내가 생각하지 않는, 자리 표시 자 문자입니다 필요

tr '/' '¢' | tr '\\' '/' | tr '¢' '\\' 

을하고이 또한에만 오래가 나타납니다 결코로 작동 내 의견으로는 '¢', 내 경우에는 아마도 그걸로 충분할거야.하지만, 누가 알지? 물론 sed을 사용하여이 같은 생각을하고 좀 더 견고하게 만든 다음 '¢'를 임의의 임의의 문자열 ('½ | # & ¬_ $'또는 뭔가)로 바꿀 수 있습니다.

그러나이 작업을 수행하는 단일 bash 명령이 있는지 알고 싶었습니다.이 명령은이 작업을 더 짧고 읽기 쉽고 강력하게 만듭니다. 아마 sed 상자에서 이것을 할 수 있을까요?


이 작업을 수행하는 동안 올바른 작업 이름은 무엇입니까? '양방향 대체'와 같습니다. 내 Google 검색이 아마도 더 유익했음을 알았다면. 나는 또한 '스왑 문자'를 시도했지만 정기적 인 교체 작업 만 발견했습니다.

답변

5

tr은 문자열을 한 번만 통과하므로 문자가 두 번 이상 바뀌지 않으므로 중간 문자는 필요하지 않습니다. 다음 tr 명령을 수행해야합니다

tr '/\' '\\/' <<< '//\\ then \\// and/and finally a \ in the string' 

\\// then //\\ and \ and finally a/in the string 

또는, 더 간단하게 산출 :

sed 'y#/\\#\\/#' <<< '//\\ then \\// and/and finally a \ in the string' 

이순신 :

tr ab ba <<< "ab ba bb aa" # yields "ba ab aa bb" 

또한 sed을 사용할 수 있습니다 필드들 man sed 가입일

\\// then //\\ and \ and finally a/in the string 

는 :

[2addr] Y/문자열 1/문자열 2/

는 문자열 2로부터 대응하는 문자 패턴 영역에 문자열 1 문자의 모든 항목을 대체. 문자열을 구분하기 위해 슬래시 대신 백 슬래시 또는 개행 문자 이외의 문자를 사용할 수 있습니다. string1과 string2 내에서 백 슬래시 뒤에 "n"이 오는 것은 개행 문자로 대체됩니다. 한 쌍의 백 슬래시가 리터럴 백 슬래시로 대체됩니다. 마지막으로 백 슬래시 다음에 다른 문자 (줄 바꿈 제외)가 오는 것은 리터럴 문자입니다.

+2

감사합니다. 어쩌면 당신은 거기에 더 일반적인 일 (나는 이것으로부터 배웠다)을 추가 할 수있다 :'tr' 치환은 요소별로 일어난다. 'tr ab xy'에서 'a'는 'x'로 대체되고 'b'는 'y'로 대체되므로 'tr ab ba'는 'a'를 'b'로 바꾸며 그 반대도 마찬가지입니다. 그것은'tr'에 대해 제가 빠뜨린 더 일반적인 것이 었습니다. 역 슬래시를 사용한 예는 다소 불행한 일입니다. 도망치기 때문입니다. 실제로는 요점과 종류가 혼란 스럽기 때문에 (따라서 답변도). – dingalapadum

+1

답변을 편집하고 위에서 언급 한 내용을 추가하면 내일 받아 들여서 기꺼이 받아 들일 것입니다. Btw. 나는 편집을 좋아한다 – dingalapadum

1
tr \\\\/ /\\\\ 

입력 :

//fgdf\\ 

출력 :

\\fgdf// 

왜 4 백 슬래시? 두 개의 백 슬래시는 셸에서 백 슬래시를 하나 생성하므로 tr\\//\\을받습니다. 자체 백 슬래시 시퀀스가 ​​있으므로 두 개의 백 슬래시를 역 슬래시로 해석합니다.

+2

왜 '백 슬래시가 4 번인가?'라는 질문에 대한 정답은'내가 내 문자열을 적절히 인용하지 않았기 때문에 '입니다. 특정 작업 (예 : 변수 확장)을 수행하는 데 큰 따옴표가 필요하지 않은 경우 작은 따옴표를 사용하여 스크립트/문자열을 항상 인용 한 다음 특정 작업 (예 : 와일드 카드 확장)을 수행 할 따옴표가 없으면 항상 큰 따옴표를 사용하십시오. –

+0

따옴표는 인용 부호보다 낫지 않고, 표현식을 단순하게 만들지 않으며 아무 것도 추가하지 않습니다. – user31264

+0

Morton은 내 대답에 부정적인 의견을 추가하려고 노력하면서 나를 따라 잡습니다. 이 사람은 제 대답에 매우 적극적입니다. – user31264