【sed】シェルスクリプト総合@LINUX Part2【awk】
\nはPOSIXでも規定されているし大抵の環境で使える筈。
普通に考えれば
>>932が順当。
じゃあ、順当じゃなく。
fmt hoge | tr '-' '\n-'
cat /tmp/test.txt | gawk '/^-/ && NR!=1 {print""} {printf($0" ")} END{print""}'
>>929 awk で
{
if ($0 ~ /^\-/ && NR == 1) {
printf("%s ", $0);
} else if ($0 ~ /^\-/ && NR != 1) {
printf("\n%s ", $0);
} else {
printf("%s ", $0);
}
}
END {
print "";
}
938 :
login:Penguin:2007/07/07(土) 08:39:22 ID:niJj2YwU
>>937 状態遷移で改行の制御にしてみた
BEGIN {nl=""}
/^-/ {printf("%s%s", nl, $0);nl="\n";next}
{printf(" %s", $0)}
END {printf("\n")}
ファイル名をすべて小文字にしたいのですけど、
これはCなどのプログラムを書かないとできませんか?
>>939 こんなんでいい?
perl -e '$f=$ARGV[0]; rename $f, lc $f' FILENAME
#!/usr/bin/perl
while (true) {
rename($_, lc($_));
}
# こうですか!? 分かりません><
zshで autoload -U zmv; zmv '(*)' '${(L)$1}'
renameで rename '$_=lc($_)' *
943 :
login:Penguin:2007/07/07(土) 14:35:03 ID:niJj2YwU
ls | while read f; do
nf=`echo $f | tr 'A-Z' 'a-z'`
mv $f $nf
done
for f in `ls` はファイルが多いと死亡するのでX
>>940,941
perlはあまりわからないですけどできるのですね。
>>942 autoloadははじめてみました。
>>943 あ、自分がやったことがあったのはこれだ。trと言うコマンドでした。
たまたま同じ小文字のファイルがないか注意してやります。
945 :
login:Penguin:2007/07/07(土) 18:22:07 ID:niJj2YwU
perlはshellスクリプトのアンチテーゼ。
perl -pe -i の破壊力は強力だけど、諸刃の剣。
awkで済むものはawkでやるのがいいかな?
awkの入力駆動はある意味、最高。
awkいいんだけど
正規表現が貧弱
947 :
login:Penguin:2007/07/07(土) 18:34:21 ID:niJj2YwU
>>944 [ ! -f $nf ] && mv $f $nf
or
[ -f $nf ] && continue
mv $f $nf
948 :
login:Penguin:2007/07/07(土) 18:40:57 ID:niJj2YwU
>>946 perl:高度な文字列操作中心orループ速度が高速でなくてはいけない場合
sh:ファイル操作中心orループが低速でいい場合
で使い分けてる
shは明示的にファイルをオープン・クローズしなくてもいいんで、
perlよりもステップが減るケースが多いから。
このスレってsedとawkのスレだと思っていた。スレタイ紛らわしいな。
次スレはそんなことないよう、適切なスレタイでお願いします。
>>950 さん!
申し訳ありませんでした。
次は
【csh】シェルスクリプト総合@LINUX Part3【tcsh】
とします。
>>950 あとPowerShellも足しといてくれ
>>950 それだと、B-shell系が除外されてるみたいだよ
【csh】シェルスクリプト総合@LINUX Part3【sh】
で。
>>950 はネタでしょ。
まぁ、単に「シェルスクリプト総合 Part3」でいいんじゃね?
でも*shでスレタイ検索できるとうれしい
関数で返り値を返すにはどうすればいいんだ?
foo(){
# ここで文字列を返したい
}
baz=`foo $1`
foo(){
# ここで文字列を返したい
echo "氏ね"
}
baz=`foo $1`
foo(){
# ここで文字列を返したい
echo "ボクの肛門も返り値にされてしまいそうです。"
}
baz=`foo $1`
>>943 > ls | while read f; do
> nf=`echo $f | tr 'A-Z' 'a-z'`
> mv $f $nf
> done
すばらしい。これ、ディレクトリを再帰的にたぐるバージョンできないかしら。
>>959 find ./ -type f -exec "f={}; nf=$(echo $f | tr 'A-Z' 'a-z'); mv $f $nf"
じゃだめなの?
961 :
960:2007/07/09(月) 23:30:19 ID:lRpzjg90
最後につける \; を忘れたorz
こんな感じ?(動かしてないのであれだけど)
lcdir() {
for i in "$@"
do
test -d "$i" && (cd "$i" && lcdir *)
mv "$i" "`echo $i | tr A-Z a-z`"
end
}
lcdir dir
find /path -type f | awk '/[A-Z]/{print "mv", $0, tolower($0)}' | sh
>>948 >sh:ファイル操作中心orループが低速でいい場合
ループが必要そうに見えてもうまくやればなくせることが多いし、
起動されるコマンドの数を減らせば遅さはカバーできることがほとんど。
965 :
929 :2007/07/10(火) 07:16:10 ID:ejVmm0rs
俺なら頑張っても
「やべ、Basicまざった」
位しか言えないな、、。
begin〜endといえば、Pascalだろ。
969 :
login:Penguin:2007/07/10(火) 22:10:27 ID:vliNJz3h
>>964 こつじゃないけど、デバッグ中は
echo mv $f $nf
これなら実行しないで、実行されるコマンドのみ確認できる
何とかの知恵袋
970 :
950:2007/07/10(火) 23:24:32 ID:qGthZdME
>>968 begin ないじゃん。
do 書いたから多分Rubyになっちゃったんだろうな。。
972 :
login:Penguin:2007/07/11(水) 04:19:18 ID:tJ7VLZ7p
sed、awkスレじゃないので次のスレタイは適切なのたのむ
>>971 へぇ〜知らんかった。
do〜beginってキモイねw
974 :
login:Penguin:2007/07/11(水) 13:30:14 ID:tP/pX7fg
sedでhtmlファイル内のURLリンクだけ抜き出したいのですが、
うまくいきません。
sed 's/http[^html]*html//g'
こんな感じの処理を、これ以外を処理するという感じに書けませんか?
教えていただけるとありがたいです。
grepとパイプで徐々に条件を絞りこんでいけばええんとちゃう?
>>974 頼むからまともなリファレンスの一つも見てくれ orz
[^html]はないだろうよ。
GNU sed だったら -P オプションつけて Perl互換の正規表現使って書け。
それ以外ならあきらめれ。
grepとawkで出来るだろ。なんでsed
そこにsedがあるから
awkで出来るならgrep使う意味もあんまり無いけどな。
>>980 awkを
grep なんとか | awk '{ print $1,$2}'
みたいに行分割ツールだと思ってるやつ、いるな。もうちょっと勉強しろと。
そんな俺のお勧めの本は本家awk作者の書いた高い本じゃなくてASCIIの
「awkを256倍使う本」(オレンジ本)だ。昭和の時代からある本だが、未だに増刷版が
手に入る。これを通読すれば、awkのことは大体わかる。ふざけた口調だし、DOS時代の
記述が目に付くような骨董本だがな。
>>981 このスレ見てるとsedの方もsとdぐらいしかコマンドがないと思ってる奴多いじゃん。
あとGNU拡張かもしれんがgrepの-Aと-Bは何げに便利。
awkは配列が便利だ