tr
set of characters
1つを別のものに翻訳するために使用できる素晴らしいツールですset of characters
。
これらのコマンドを使用して他のコマンドにsed , awk, perl
翻訳できます。set of characters
文字列セットたとえば、翻訳でき<
ます>
入力する <
そして>
、しかし、この目的のためにこれらのコマンドを使用する必要はないようです!
これを実行できる他のコマンドはありますか?
答え1
どのシェルを使用しているかはわかりませんが、おそらくtr
組み込まれていません。確かにbashやzshでは動作しません。 :) 実行してtype tr
自分で確認してみてください。
それはおそらく仕事sed
に適したツールでしょう。それがまさにその目的です。適切なperl
。awk
ケースが非常に単純でパイプの代わりに文字列変数を使用している場合は、bashを使用して文字列の検索や変数の置換などの実際の組み込み機能を使用できます。
string="Stuf with <tag> in it."
escaped=${string//</<}
escaped=${escaped//>/>}
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」動作をエミュレートするために、これを別のエイリアスとして使用していますfoo
。bar
pwdを変更してください。
$ function cds { cd "$(pwd | trs "$1" "$2")" ; }
$ mkdir -p /tmp/foo /tmp/bar
$ cd /tmp/foo
$ cds foo bar
$ pwd
/tmp/bar
sed
/
または他の正規表現に安全でない文字を渡すと、バージョンでは機能しません。