【sed】シェルスクリプト総合@LINUX Part2【awk】

このエントリーをはてなブックマークに追加
934login:Penguin:2007/07/06(金) 22:37:56 ID:d5hv1Ayr
\nはPOSIXでも規定されているし大抵の環境で使える筈。
普通に考えれば>>932が順当。
935login:Penguin:2007/07/06(金) 23:09:36 ID:eiWfMUpf
じゃあ、順当じゃなく。
fmt hoge | tr '-' '\n-'
936login:Penguin:2007/07/07(土) 01:22:38 ID:FIUQeagW
cat /tmp/test.txt | gawk '/^-/ && NR!=1 {print""} {printf($0" ")} END{print""}'
937login:Penguin:2007/07/07(土) 02:34:42 ID:Le67A90t
>>929
awk で

{
if ($0 ~ /^\-/ && NR == 1) {
printf("%s ", $0);
} else if ($0 ~ /^\-/ && NR != 1) {
printf("\n%s ", $0);
} else {
printf("%s ", $0);
}
}
END {
print "";
}
938login: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")}

939login:Penguin:2007/07/07(土) 12:25:33 ID:Yc3WeePv
ファイル名をすべて小文字にしたいのですけど、
これはCなどのプログラムを書かないとできませんか?
940login:Penguin:2007/07/07(土) 12:38:07 ID:NvqElBXo
>>939
こんなんでいい?
perl -e '$f=$ARGV[0]; rename $f, lc $f' FILENAME
941login:Penguin:2007/07/07(土) 12:48:34 ID:5zeDGoS/
#!/usr/bin/perl
while (true) {
rename($_, lc($_));
}

# こうですか!? 分かりません><
942login:Penguin:2007/07/07(土) 13:17:34 ID:CShhEr+c
zshで autoload -U zmv; zmv '(*)' '${(L)$1}'
renameで rename '$_=lc($_)' *
943login: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
944login:Penguin:2007/07/07(土) 15:38:43 ID:Yc3WeePv
>>940,941
perlはあまりわからないですけどできるのですね。
>>942
autoloadははじめてみました。
>>943
あ、自分がやったことがあったのはこれだ。trと言うコマンドでした。

たまたま同じ小文字のファイルがないか注意してやります。
945login:Penguin:2007/07/07(土) 18:22:07 ID:niJj2YwU
perlはshellスクリプトのアンチテーゼ。
perl -pe -i の破壊力は強力だけど、諸刃の剣。
awkで済むものはawkでやるのがいいかな?
awkの入力駆動はある意味、最高。
946login:Penguin:2007/07/07(土) 18:34:22 ID:fRAuarhz
awkいいんだけど
正規表現が貧弱
947login:Penguin:2007/07/07(土) 18:34:21 ID:niJj2YwU
>>944
[ ! -f $nf ] && mv $f $nf
or
[ -f $nf ] && continue
mv $f $nf

948login:Penguin:2007/07/07(土) 18:40:57 ID:niJj2YwU
>>946
perl:高度な文字列操作中心orループ速度が高速でなくてはいけない場合
sh:ファイル操作中心orループが低速でいい場合
で使い分けてる
shは明示的にファイルをオープン・クローズしなくてもいいんで、
perlよりもステップが減るケースが多いから。
949login:Penguin:2007/07/08(日) 03:35:40 ID:R3wSaX8Q
このスレってsedとawkのスレだと思っていた。スレタイ紛らわしいな。
次スレはそんなことないよう、適切なスレタイでお願いします。 >>950 さん!
950login:Penguin:2007/07/08(日) 09:08:46 ID:yskZMM9a
申し訳ありませんでした。
次は
【csh】シェルスクリプト総合@LINUX Part3【tcsh】
とします。
951login:Penguin:2007/07/08(日) 14:09:16 ID:7xGE5YGp
>>950
あとPowerShellも足しといてくれ
952login:Penguin:2007/07/08(日) 16:04:38 ID:NPyNCDii
>>951
PowerShellはいらん。
953login:Penguin:2007/07/08(日) 23:15:35 ID:6LFQaTbX
>>950

それだと、B-shell系が除外されてるみたいだよ

【csh】シェルスクリプト総合@LINUX Part3【sh】
で。
954login:Penguin:2007/07/08(日) 23:22:52 ID:+jEhGz9Z
>>950 はネタでしょ。

まぁ、単に「シェルスクリプト総合 Part3」でいいんじゃね?
955login:Penguin:2007/07/09(月) 00:10:20 ID:AN/aqvCc
でも*shでスレタイ検索できるとうれしい
956login:Penguin:2007/07/09(月) 00:21:21 ID:odHzoAWA
関数で返り値を返すにはどうすればいいんだ?

foo(){
# ここで文字列を返したい
}

baz=`foo $1`


957login:Penguin:2007/07/09(月) 00:46:47 ID:+fFBXjtS
foo(){
# ここで文字列を返したい
echo "氏ね"
}

baz=`foo $1`
958login:Penguin:2007/07/09(月) 07:43:05 ID:j+0JUicd
foo(){
# ここで文字列を返したい
echo "ボクの肛門も返り値にされてしまいそうです。"
}

baz=`foo $1`
959login:Penguin:2007/07/09(月) 23:09:46 ID:znT8reqA
>>943
> ls | while read f; do
> nf=`echo $f | tr 'A-Z' 'a-z'`
> mv $f $nf
> done

すばらしい。これ、ディレクトリを再帰的にたぐるバージョンできないかしら。
960login:Penguin:2007/07/09(月) 23:29:20 ID:lRpzjg90
>>959
find ./ -type f -exec "f={}; nf=$(echo $f | tr 'A-Z' 'a-z'); mv $f $nf"
じゃだめなの?
961960:2007/07/09(月) 23:30:19 ID:lRpzjg90
最後につける \; を忘れたorz
962login:Penguin:2007/07/09(月) 23:39:42 ID:ocug9qoC
こんな感じ?(動かしてないのであれだけど)

lcdir() {
 for i in "$@"
 do
  test -d "$i" && (cd "$i" && lcdir *)
  mv "$i" "`echo $i | tr A-Z a-z`"
 end
}
lcdir dir
963login:Penguin:2007/07/09(月) 23:44:32 ID:EkunXhiP
find /path -type f | awk '/[A-Z]/{print "mv", $0, tolower($0)}' | sh

>>948
>sh:ファイル操作中心orループが低速でいい場合

ループが必要そうに見えてもうまくやればなくせることが多いし、
起動されるコマンドの数を減らせば遅さはカバーできることがほとんど。
964login:Penguin:2007/07/10(火) 00:00:28 ID:odHzoAWA
>>962
end はなくね?
965929 :2007/07/10(火) 07:16:10 ID:ejVmm0rs
>>932-938
ども
966login:Penguin:2007/07/10(火) 08:36:15 ID:kjj3OspV
>>964
やべ、Rubyまざった
967login:Penguin:2007/07/10(火) 09:02:31 ID:Ct64T7Yk
俺なら頑張っても

「やべ、Basicまざった」

位しか言えないな、、。
968login:Penguin:2007/07/10(火) 11:25:51 ID:bZQyYBJK
begin〜endといえば、Pascalだろ。
969login:Penguin:2007/07/10(火) 22:10:27 ID:vliNJz3h
>>964
こつじゃないけど、デバッグ中は
echo mv $f $nf
これなら実行しないで、実行されるコマンドのみ確認できる
何とかの知恵袋
970950:2007/07/10(火) 23:24:32 ID:qGthZdME
シェルスクリプト総合@LINUX Part3
ttp://pc11.2ch.net/test/read.cgi/linux/1184077033/

テンプレをどこかに保存してあるのなら、すんません。それは使ってません。
971login:Penguin:2007/07/10(火) 23:36:16 ID:NZ+MEzUa
>>968

begin ないじゃん。

do 書いたから多分Rubyになっちゃったんだろうな。。
972login:Penguin:2007/07/11(水) 04:19:18 ID:tJ7VLZ7p
sed、awkスレじゃないので次のスレタイは適切なのたのむ
973login:Penguin:2007/07/11(水) 13:29:35 ID:8OVf7N5d
>>971
へぇ〜知らんかった。
do〜beginってキモイねw
974login:Penguin:2007/07/11(水) 13:30:14 ID:tP/pX7fg
sedでhtmlファイル内のURLリンクだけ抜き出したいのですが、
うまくいきません。
sed 's/http[^html]*html//g'
こんな感じの処理を、これ以外を処理するという感じに書けませんか?

教えていただけるとありがたいです。
975login:Penguin:2007/07/11(水) 16:06:40 ID:NuF0tQDz
>>974
lynx 使うと簡単にできるよ。
976login:Penguin:2007/07/11(水) 20:36:07 ID:hhul5Kpu
grepとパイプで徐々に条件を絞りこんでいけばええんとちゃう?
977login:Penguin:2007/07/12(木) 01:50:22 ID:drYP50FL
>>974
頼むからまともなリファレンスの一つも見てくれ orz
[^html]はないだろうよ。

GNU sed だったら -P オプションつけて Perl互換の正規表現使って書け。
それ以外ならあきらめれ。
978login:Penguin:2007/07/13(金) 01:49:40 ID:XyYLHIIQ
grepとawkで出来るだろ。なんでsed
979login:Penguin:2007/07/13(金) 01:52:03 ID:sl7uOFWd
そこにsedがあるから
980login:Penguin:2007/07/13(金) 07:47:34 ID:pzA4frRT
awkで出来るならgrep使う意味もあんまり無いけどな。
981login:Penguin:2007/07/13(金) 10:43:13 ID:1FqGLDbV
>>980
awkを 

grep なんとか | awk '{ print $1,$2}'

みたいに行分割ツールだと思ってるやつ、いるな。もうちょっと勉強しろと。

そんな俺のお勧めの本は本家awk作者の書いた高い本じゃなくてASCIIの
「awkを256倍使う本」(オレンジ本)だ。昭和の時代からある本だが、未だに増刷版が
手に入る。これを通読すれば、awkのことは大体わかる。ふざけた口調だし、DOS時代の
記述が目に付くような骨董本だがな。
982login:Penguin:2007/07/13(金) 14:41:26 ID:i/OEyHK/
>>981
このスレ見てるとsedの方もsとdぐらいしかコマンドがないと思ってる奴多いじゃん。
あとGNU拡張かもしれんがgrepの-Aと-Bは何げに便利。
983login:Penguin
awkは配列が便利だ