
カンマで区切られた3つの列があります。姓、名前、社会的な名前。
姓の列のすべての文字を大文字に置き換えようとしています。
sed 's/\([^,]*\)/\U\1/' foo.file
osxでは、このコマンドは、大文字の文字列を開始するのではなく、各行の先頭に大文字のUを追加しますが、Ubuntuインスタンスでは期待どおりに機能します。
なぜこれが起こるのかわかりません。
マニュアルページには、「マルチバイト文字は ''s'' および ''y'' コマンドの区切り文字としては使用できません。区切り文字を「i」に置き換えると同じことが発生するため、問題になりません。
答え1
sed 'h;s/[^,]*,[^,]*,//
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
H;x;s/[^,]*\n//
' foo.file
答え2
\U
実際にBSDismに触発されたGNUismです。これはエディタs
の対応するコマンドex
(コマンドラインモードvi
)からのものです。
OS/X は、AT&T の著作権問題の後、最初から書き直されたsed
4.4BSD から派生した FreeBSD から派生した可能性が高いです。sed
いずれにせよ、BSDやAT&Tは彼らの注文をsed
サポートしていません。\U
s
ポータブルで大文字に変換するには、sed
通常y
次のコマンドを使用します。すでに示されているように。
ただし、ここではより良いアプローチを使用できますawk
。
awk -F, -vOFS=, '{$1 = toupper($1); print}'
答え3
簡単な作業には必要ありません。sed
while IFS=',' read -r first mid last
do
echo "$first, $mid, ${last^^}"
done < file_with_commas
バージョンが変数拡張をサポートしていない場合は、bash
次のものを使用できます。tr
last=$(echo $last | tr [[:lower:]] [[:upper:]])
答え4
/U と /L が OSX/BSD sed では動作しないようです。
とともに
sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping
ありがとうございます。私の評判は投票するほど高くはありませんが、Mikeはsedを使って私の問題を解決し、私もStephaneのコメントに同意します。 awkがより良い選択のようです。