- シェルスクリプト総合スレより
fold
- お手軽
- 出力を加工するのは xargs などでおこなうのかな
$ echo "hogefuga" | fold -s4
hoge
fuga
$ echo "hogefuga" | fold -s4 | xargs -I {} echo A:{}
A:hoge
A:fuga
while read
- read -N が環境によってはない
- 出力の加工や利用が簡単そう
- 多分大丈夫だけど、サブシェル問題は忘れずに
$ echo "hogefuga" | while read -N 4 i;do echo ${i};done
hoge
fuga
$ echo "hogefuga" | while read -N 4 i;do echo A:${i};done
A:hoge
A:fuga
参考スレ
107 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 12:07:28.33
標準入力(od -xが出力した文字列)の文字列を4バイトごと切り取り、
それをforループで処理させたい思っており、現在はこんな感じのスクリプト作ってます
OSはCentOS、シェルはbashです
#!/bin/sh
for STR in `4バイトごとに切り取る処理`
do
hogehoge $STR
done
この「4バイトごとに切り取る処理」ですが、現在はsplitで4バイト単位に切り取り、
分割後のファイルを順次読み込ませるということにしているのですが、
分割後のファイルが沢山作られるので遅くなり、またやりたい事の割にやってることが
複雑すぎるので、なんとか改善したいと思ってます
そういうことをしてくれる、いい方法はありますでしょうか
標準出力を、指定したバイト数単位にセパレータを挟んで出力してくれるコマンド、みたいな
cutでやってみようと思ったのですが、これだとオフセットを4バイトずつずらしながら
切り出していく処理となりそうで、これもまた複雑だなぁ、と…
108 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 12:14:05.59
$ echo 'hogefugapiyo' | while read -N 4 STR; do echo $STR; done
109 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 12:38:48.75
ふらっと通りがかったが感動した!
110 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 13:01:14.29
107です
>>108
なるほどreadでやるのですね
バイト数も任意で変更できそうで、柔軟性もありますね
ありがとうございました
111 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 13:41:30.36
>>108
つfold
じゃだめなんだっけ?
forをwhileに書き換えるのはおすすめしない。
112 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 14:35:27.41
>>108
read: Illegal option -N
113 :名無しさん@お腹いっぱい。 :2014/01/11(土) 15:13:02.47
dd bs=1 count=切り出しバイト数 skip=オフセットバイト数
でなんとかならんかい?
114 :名無しさん@お腹いっぱい。 :sage :2014/01/11(土) 15:16:16.51
> 標準出力を、指定したバイト数単位にセパレータを挟んで出力
fold だとセパレータの指定はできないんじゃない?
$ sep="@"; echo 'hogefugapiyo' | while read -N 4 str; do echo -en "${str}${sep}";done
とかしたいのかと思ったけど…
# 最後にセパレータがくっついちゃうけどね