tr 명령이 문자를 더 긴 문자열로 변환할 수 있습니까?

tr 명령이 문자를 더 긴 문자열로 변환할 수 있습니까?

trset of characters하나를 다른 것으로 번역하는 데 사용할 수 있는 훌륭한 도구입니다 set of characters.

이와 같은 명령을 사용하여 다른 명령으로 sed , awk, perl번역할 수 있습니다 .set of characters문자열 세트예를 들어, 번역할 수 <있고> 입력하다 &lt;&gt;, 그러나 이 목적을 위해 이러한 명령을 사용할 필요는 없는 것 같습니다!

이 작업을 수행할 수 있는 다른 명령이 있습니까?

답변1

어떤 쉘을 사용하고 있는지는 모르겠지만 아마도 tr내장되어 있지 않을 것입니다. 확실히 bash나 zsh에서는 작동하지 않습니다. :) 실행해보고 type tr직접 확인해 보세요.

아마도 sed작업에 적합한 도구 일 것입니다. 그것이 바로 그 목적입니다. 적절한 .perlawk

사례가 매우 간단하고 파이프 대신 문자열 변수를 사용하는 경우 bash를 사용하여 문자열 검색 및 변수 바꾸기와 같은 실제 내장 기능을 사용할 수 있습니다.

string="Stuf with <tag> in it."
escaped=${string//</&lt;}
escaped=${escaped//>/&gt;}
echo $escaped

답변2

표준 매개변수 처리를 사용하려는 경우 여러 문자열을 다른 여러 문자열 세트로 바꾸면 지저분해질 수 있습니다. 일반적으로 명령은 일련의 원자적 인수 뒤에 일련의 원자적 인수를 사용하며, 인수가 인수 뒤에 오는 것( --또는 모호한 경우 분리됨)을 제외하고 순서는 중요하지 않습니다. 이 경우 개요를 어떻게 구성하시겠습니까?

다음은 간단한 대체를 수행하는 간단한 함수입니다.

$ trs() {
    local string=$1
    shift
    for replacement in "$@"
    do
        string="$(sed -e "s/$replacement/g" <<< "$string")"
    done
    printf "$string"
}
$ trs '1 2 3' '1/foo' '2 3/bar baz'
foo bar baz

또는 매개변수 쌍을 사용할 수 있습니다.

$ trs() {
    local string=$1
    shift
    while [ $# -gt 0 ]
    do
        string="$(sed -e "s/$1/$2/g" <<< "$string")"
        shift 2
    done
    printf "$string"
}
$ trs '1 2 3' 1 foo '2 3' 'bar baz'
foo bar baz

답변3

sed끔찍할 수도 있지만 간단한 문자를 문자열로 바꾸는 것은 sed그다지 나쁘지 않습니다.

x문자열로 바꾸려면 다음을 수행하십시오 bar.

{something-that-outputs-something-on-stdout} | sed -e 's/x/bar/g'

이것이 처리하려는 파일인 경우 다음을 사용할 수 있습니다.

sed -e 's/x/bar/g' {filename}

(끝의 "g"는 "전역"을 의미하며, 이는 첫 번째 항목뿐만 아니라 줄의 모든 항목을 대체한다는 의미입니다.)

답변4

더 긴 문자열이 무엇인지 안다면 sed -e s/xx/yy/g대답은 확실합니다 .

그러나 보다 일반적이고 함수 인수의 문자열과 같은 문자열을 입력으로 받아들이고 싶다면 sed를 사용할 수 없습니다. 정규식에서 사용하기 전에 문자열을 이스케이프해야 하는데 이는 매우 어렵습니다. .

이를 보다 안정적으로 수행하려면 다음 oneliner를 사용할 수 있습니다.

python -c '(lambda s: s.stdout.write(s.stdin.read().replace(*s.argv[1:])))(__import__("sys"))'

편의를 위해 .bashrc에 별칭으로 추가합니다.

alias trs='python -c '\''(lambda s: s.stdout.write(s.stdin.read().replace(*s.argv[1:])))(__import__("sys"))'\'''

그리고:

$ echo /some-path/file | trs -path /dir1/dir2
/some/dir1/dir2/file

cds배경: zsh의 "cd foo bar" 동작을 에뮬레이트하기 위해 이것을 다른 별칭으로 사용하고 있습니다 foo. barpwd를 바꾸세요.

$ function cds { cd "$(pwd | trs "$1" "$2")" ; }

$ mkdir -p /tmp/foo /tmp/bar
$ cd /tmp/foo
$ cds foo bar
$ pwd
/tmp/bar

sed/이나 기타 정규식에 안전하지 않은 문자를 전달하면 버전에서는 작동하지 않습니다.

관련 정보