trコマンドは文字をより長い文字列に変換できますか?

trコマンドは文字をより長い文字列に変換できますか?

trset of characters1つを別のものに翻訳するために使用できる素晴らしいツールです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を使用できません。正規表現で使用する前に文字列をエスケープする必要がありますが、これは非常に困難です。 。

これをより確実に行うには、次のオネライナーを使用できます。

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」動作をエミュレートするために、これを別のエイリアスとして使用していますfoobarpwdを変更してください。

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

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

sed/または他の正規表現に安全でない文字を渡すと、バージョンでは機能しません。

関連情報