シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
探検
シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
402デフォルトの名無しさん
2019/07/28(日) 04:28:55.80ID:LPR+u+AV Ruby では、1 の個数を数える
seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
403デフォルトの名無しさん
2019/07/28(日) 04:30:02.41ID:vKAr7iFy 何の意味があんの?
Perlだと複雑に書けるよってこと?
Perlだと複雑に書けるよってこと?
404デフォルトの名無しさん
2019/07/28(日) 04:37:14.85ID:UCGA8APU 1 を数えたいなら
$ seq 30 | grep -o 1 | wc -l
$ seq 30 | grep -o 1 | wc -l
405デフォルトの名無しさん
2019/07/28(日) 10:48:09.20ID:/N9EqgUo きっと見たこともない構文だと思って書いた
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった
本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった
本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
406デフォルトの名無しさん
2019/07/28(日) 11:51:54.16ID:V62sQMom 改行を無視して検索は?
407デフォルトの名無しさん
2019/07/28(日) 12:45:34.52ID:/N9EqgUo 3行以上にまたがる複数行?
2行まで?
2行まで?
408デフォルトの名無しさん
2019/07/29(月) 21:57:36.07ID:LpaqQy0x PowerShell では、
$matches = 1..30 | Select-String "1" -AllMatches
$matches.Matches.Count
#=> 13
$matches = 1..30 | Select-String "1" -AllMatches
$matches.Matches.Count
#=> 13
409デフォルトの名無しさん
2019/07/30(火) 00:35:05.01ID:TDafWW+v PowerShellって嫌われてるけど結構便利だよね。
でも使い熟せる自信も気力もないw
でも使い熟せる自信も気力もないw
410デフォルトの名無しさん
2019/07/30(火) 07:02:14.50ID:lWAzz/KK PowerShellってどういう場面で使われるの?
Bash使わないでPowerShell使うことってあんの?
Bash使わないでPowerShell使うことってあんの?
411デフォルトの名無しさん
2019/07/30(火) 07:18:22.77ID:RYwsY7rK windows update からの shutdown
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
412デフォルトの名無しさん
2019/07/30(火) 07:51:48.49ID:TDafWW+v 喩えが文学的すぎて分からん
413デフォルトの名無しさん
2019/07/30(火) 18:08:45.58ID:EUusSyFO414デフォルトの名無しさん
2019/07/30(火) 18:16:09.63ID:fdfPnQnm Remove-Item、Copy-Itemとか生理的に受け付けない体になってる。
415デフォルトの名無しさん
2019/07/30(火) 18:28:39.62ID:R+5nd6EU >>413
DOcker SHell
DOcker SHell
416デフォルトの名無しさん
2019/07/30(火) 18:34:09.08ID:EUusSyFO 時代からしてそれはないだろ
417デフォルトの名無しさん
2019/07/30(火) 19:37:33.76ID:6/Ph+fdB >>408
オシャレだ
オシャレだ
418デフォルトの名無しさん
2019/07/30(火) 20:50:28.04ID:TDafWW+v >>413
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。
OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
http://schilytools.sourceforge.net/bosh.html
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。
OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
http://schilytools.sourceforge.net/bosh.html
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
419418
2019/07/30(火) 20:57:36.54ID:TDafWW+v https://unix.stackexchange.com/a/223935
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。
しかし肝心要のSolaris Bシェルの手引書
https://docs.oracle.com/cd/E56342_01/html/E54074/jsh-1.html
にはその記述が見当らず……。どゆこと???
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。
しかし肝心要のSolaris Bシェルの手引書
https://docs.oracle.com/cd/E56342_01/html/E54074/jsh-1.html
にはその記述が見当らず……。どゆこと???
420デフォルトの名無しさん
2019/07/30(火) 21:12:05.50ID:EUusSyFO >>418
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)
あと>>413のリンクが間違っていたので訂正
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)
あと>>413のリンクが間違っていたので訂正
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
421デフォルトの名無しさん
2019/07/30(火) 21:15:06.53ID:EUusSyFO ここには元ネタはUNOSとか書いてあるね。
https://unix.stackexchange.com/questions/453827/making-alias-of-rm-command
This concept of parameterizable aliases has been invented by former AT&T
employees in 1980 and implemented in their real time UNIX clone called UNOS.
https://unix.stackexchange.com/questions/453827/making-alias-of-rm-command
This concept of parameterizable aliases has been invented by former AT&T
employees in 1980 and implemented in their real time UNIX clone called UNOS.
422デフォルトの名無しさん
2019/07/30(火) 21:19:41.35ID:EUusSyFO https://www.in-ulm.de/~mascheck/bourne/
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases
あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases
あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
423デフォルトの名無しさん
2019/07/30(火) 21:26:48.89ID:EUusSyFO https://unix.stackexchange.com/questions/145522/what-does-it-mean-to-be-sh-compatible
If you like to know more relations, e.g. with UNOS "command", "bsh" and the recent
Bourne Shell, send me a note. As a hint: UNOS command had a builtin command
"do" that acted as a one-line shell script with arguments. This idea was transferred into
the Bourne Shell as "dosh" and permits parameterizable aliases, something you cannot get from ksh or bash. ? schily
このschilyってのはSchily Bourne Shell(=bosh)の作者かな?
If you like to know more relations, e.g. with UNOS "command", "bsh" and the recent
Bourne Shell, send me a note. As a hint: UNOS command had a builtin command
"do" that acted as a one-line shell script with arguments. This idea was transferred into
the Bourne Shell as "dosh" and permits parameterizable aliases, something you cannot get from ksh or bash. ? schily
このschilyってのはSchily Bourne Shell(=bosh)の作者かな?
424デフォルトの名無しさん
2019/07/30(火) 21:30:36.00ID:TDafWW+v425デフォルトの名無しさん
2019/07/30(火) 21:57:06.40ID:EUusSyFO 「OpenSolarisのシェルに携わってる」はちょっと疑問かな
http://schilytools.sourceforge.net/bosh.html
> The Schily Bourne Shell was derived from the Bourne Shell sources from OpenSolaris.
と書いてあるように、OpenSolarisのシェルをベースに改良したSchily Bourne Shellの作者のようだ。
OpenSolarisシェルそのものには関わってない気がする
Schily Bourne Shellには、古いBourne Shellと互換性があるoboshと
POSIX厳格なpboshと、POSIX準拠+拡張のboshの三種類のシェルが含まれていて、
そのboshにはOpenSolaris Bourne Shell にはない機能
> The enhanced Schily Bourne Shell (bosh) implements the following features that are missing
> in the OpenSolaris Bourne Shell listed above:
として、自身が昔仕事で関わっていたUNOS
https://unix.stackexchange.com/users/120884/schily
> First paid UNIX related work with UNOS in 1982.
で実装されていたdosh(元はビルトインコマンドの"do"?)を移植したという流れっぽい。
だからSolaris Bシェルの手引書には無くて当然なのだろう。
Bourne Shellにも移植された
> This idea was transferred into the Bourne Shell as "dosh"
ようだから、どこかの実装にはdoshが存在するのかも
http://schilytools.sourceforge.net/bosh.html
> The Schily Bourne Shell was derived from the Bourne Shell sources from OpenSolaris.
と書いてあるように、OpenSolarisのシェルをベースに改良したSchily Bourne Shellの作者のようだ。
OpenSolarisシェルそのものには関わってない気がする
Schily Bourne Shellには、古いBourne Shellと互換性があるoboshと
POSIX厳格なpboshと、POSIX準拠+拡張のboshの三種類のシェルが含まれていて、
そのboshにはOpenSolaris Bourne Shell にはない機能
> The enhanced Schily Bourne Shell (bosh) implements the following features that are missing
> in the OpenSolaris Bourne Shell listed above:
として、自身が昔仕事で関わっていたUNOS
https://unix.stackexchange.com/users/120884/schily
> First paid UNIX related work with UNOS in 1982.
で実装されていたdosh(元はビルトインコマンドの"do"?)を移植したという流れっぽい。
だからSolaris Bシェルの手引書には無くて当然なのだろう。
Bourne Shellにも移植された
> This idea was transferred into the Bourne Shell as "dosh"
ようだから、どこかの実装にはdoshが存在するのかも
426デフォルトの名無しさん
2019/07/30(火) 22:00:29.38ID:TDafWW+v427デフォルトの名無しさん
2019/07/30(火) 22:35:47.42ID:TDafWW+v 全然関係ないけど
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
428デフォルトの名無しさん
2019/07/30(火) 22:45:31.33ID:TDafWW+v 参考: http://austingroupbugs.net/view.php?id=249
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
429デフォルトの名無しさん
2019/07/31(水) 12:01:53.51ID:6BPSvdm1 >>414
get-alias (gal)で、alias を表示できる。
多くのLinux コマンドのalias も、指定されている
gal | where-object {$_.Definition -match "remove-item"}
# Remove-Item のalias は、del, erase, rd, ri, rm, rmdir
gal | where-object {$_.Definition -match "copy-item"}
# Copy-Item のalias は、copy, cp, cpi
gal -name ls
# ls -> Get-ChildItem
gal -name echo
# echo -> Write-Output
get-alias (gal)で、alias を表示できる。
多くのLinux コマンドのalias も、指定されている
gal | where-object {$_.Definition -match "remove-item"}
# Remove-Item のalias は、del, erase, rd, ri, rm, rmdir
gal | where-object {$_.Definition -match "copy-item"}
# Copy-Item のalias は、copy, cp, cpi
gal -name ls
# ls -> Get-ChildItem
gal -name echo
# echo -> Write-Output
430デフォルトの名無しさん
2019/07/31(水) 16:37:25.52ID:kGX3Rh8Y431デフォルトの名無しさん
2019/07/31(水) 22:49:22.63ID:FZL3ewwl >>412
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
432デフォルトの名無しさん
2019/07/31(水) 23:18:58.96ID:kGX3Rh8Y boshがビルドできずに諦めたw
433デフォルトの名無しさん
2019/07/31(水) 23:25:31.28ID:8xUIRaAC434デフォルトの名無しさん
2019/07/31(水) 23:39:26.64ID:8xUIRaAC おや?最新版、2019-07-22版でビルド失敗した。
なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
https://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/bosh/README.html
なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
https://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/bosh/README.html
435デフォルトの名無しさん
2019/07/31(水) 23:57:18.53ID:8xUIRaAC 2019-06-13までは普通にビルドできるね
2019-07-15からビルドに失敗するようになってる
2019-07-15からビルドに失敗するようになってる
436デフォルトの名無しさん
2019/08/01(木) 02:58:17.41ID:PmXIwIbo >>435
情報ありがとう。古いので試してみるわ。
情報ありがとう。古いので試してみるわ。
437デフォルトの名無しさん
2019/08/01(木) 11:35:33.85ID:czAE5CE0 関数の中は、set -eで止めたいけど、関数の外では(後処理をするために)止めたくないって場合が辛いわ
例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?
foo() {
set -e
echo 1
false
echo 2
}
でも呼び出し側では必ず後処理をしたいから止めたくない。
set +e
foo
echo "後処理"
これだと止まってしまうから、foo &&: とかすると
今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様?
( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、
fooがサブシェルなので、fooの中で定義した変数にアクセスできない
困った
例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?
foo() {
set -e
echo 1
false
echo 2
}
でも呼び出し側では必ず後処理をしたいから止めたくない。
set +e
foo
echo "後処理"
これだと止まってしまうから、foo &&: とかすると
今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様?
( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、
fooがサブシェルなので、fooの中で定義した変数にアクセスできない
困った
438デフォルトの名無しさん
2019/08/01(木) 12:20:40.41ID:aVYnxNEs >>431
それは犀の角が一本だからという、特にひねりのない喩え。
それは犀の角が一本だからという、特にひねりのない喩え。
439デフォルトの名無しさん
2019/08/01(木) 12:25:28.77ID:iHxbPEOX set -eはshellをexitするから当然の動作じゃない?
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか
関数の中だけなら横着せずに
false || return
しろってことじゃないかな
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか
関数の中だけなら横着せずに
false || return
しろってことじゃないかな
440デフォルトの名無しさん
2019/08/01(木) 13:07:42.24ID:lJwvTmEp 後処理だけなら、trap '後処理' ERR でやれば
根本的に -e の使い方が違うと思うけど
根本的に -e の使い方が違うと思うけど
441デフォルトの名無しさん
2019/08/01(木) 13:10:18.98ID:bR99qXsR $ dash
$ trap : ERR
trap: ERR: bad trap
$ trap : ERR
trap: ERR: bad trap
442デフォルトの名無しさん
2019/08/01(木) 13:15:37.05ID:lJwvTmEp EXIT でもいいぞ
443デフォルトの名無しさん
2019/08/01(木) 13:17:58.23ID:bR99qXsR どうやってEXITから終了せずに通常の流れに戻すの?
444デフォルトの名無しさん
2019/08/01(木) 13:19:11.98ID:lJwvTmEp なんやお前は
「後処理だけなら」って言ってるだろ
「後処理だけなら」って言ってるだろ
445デフォルトの名無しさん
2019/08/01(木) 15:30:04.66ID:WaJjQk0q SIGHUT とかのシグナル部分を書くとか?
446デフォルトの名無しさん
2019/08/01(木) 20:47:35.88ID:SQRHjrcQ func() {
return 123
}
if ! func; then
echo $?
fi
0って表示されるんだけど、どういうこと!?
return 123
}
if ! func; then
echo $?
fi
0って表示されるんだけど、どういうこと!?
447デフォルトの名無しさん
2019/08/01(木) 21:31:03.39ID:2c4IvXw2 >>446
戻り値123を!しているから0になっただけでは
戻り値123を!しているから0になっただけでは
448デフォルトの名無しさん
2019/08/01(木) 21:33:30.40ID:SQRHjrcQ こう書けってことか?
面倒くさいな
if func; then
:
else
echo $?
fi
面倒くさいな
if func; then
:
else
echo $?
fi
449デフォルトの名無しさん
2019/08/01(木) 22:05:20.92ID:Ye1sT2dv func || echo $? でいいんじゃね
450デフォルトの名無しさん
2019/08/01(木) 22:10:56.38ID:SQRHjrcQ 実際にはecho $?以外にもすることがあるから
451デフォルトの名無しさん
2019/08/01(木) 22:27:36.45ID:Ye1sT2dv んじゃ、
func || { echo $?; ... ; }
とか。
func || { echo $?; ... ; }
とか。
452デフォルトの名無しさん
2019/08/02(金) 02:34:53.77ID:hQ+yEyXN Cじゃないから終了コードをそんな風に使わないほうが良い気がする…
あくまで「気がする」だけだけど
あくまで「気がする」だけだけど
453デフォルトの名無しさん
2019/08/02(金) 02:59:49.78ID:O3iYpUQI 値が 0 とそれ以外だけではなく、
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
454デフォルトの名無しさん
2019/08/02(金) 03:02:36.73ID:O3iYpUQI ああ、そんな風 = 返り値が勝手に暗黙的に変わる変わらないってことかな?
だったらほぼ同意
だったらほぼ同意
455デフォルトの名無しさん
2019/08/02(金) 03:40:21.45ID:hQ+yEyXN456デフォルトの名無しさん
2019/08/02(金) 03:54:22.19ID:O3iYpUQI まあ元レスの人がどういう使い方をしたいのかわからんけど、そういう感じ
457デフォルトの名無しさん
2019/08/02(金) 07:48:45.01ID:hQ+yEyXN bcコマンドで階乗計算をしたくてコードを書いてるんだけど↓
n = 2
define f(n) {
f = 1
if (n == 0) { return(f) } /* 0! := 1 */
f = n * f(n - 1)
return(f)
}
"0! = "; f(0)
"1! = "; f(1)
"2! = "; f(2)
"5! = "; f(5)
多分これでいい筈なんだけどreturn式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
n = 2
define f(n) {
f = 1
if (n == 0) { return(f) } /* 0! := 1 */
f = n * f(n - 1)
return(f)
}
"0! = "; f(0)
"1! = "; f(1)
"2! = "; f(2)
"5! = "; f(5)
多分これでいい筈なんだけどreturn式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
458デフォルトの名無しさん
2019/08/02(金) 07:49:38.54ID:hQ+yEyXN ごめん一行目のn=2は無視って。
459デフォルトの名無しさん
2019/08/02(金) 08:02:59.58ID:XJV5qmce define f(n) {
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}
とか( n < 0 の場合、無限ループになるけど)
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}
とか( n < 0 の場合、無限ループになるけど)
460デフォルトの名無しさん
2019/08/02(金) 08:15:06.73ID:hQ+yEyXN >>459
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
461デフォルトの名無しさん
2019/08/02(金) 08:42:59.37ID:dUmy9lW0 elseはGNU拡張
else使えないならこうするしかない
define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
else使えないならこうするしかない
define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
462デフォルトの名無しさん
2019/08/02(金) 09:23:07.90ID:7tJhBDcy463デフォルトの名無しさん
2019/08/02(金) 11:27:07.42ID:hQ+yEyXN 世の中には例え話を持ち出さないと気が済まない人が一定数存在する。
464デフォルトの名無しさん
2019/08/02(金) 12:50:24.63ID:vUPSv33I >>462
知らんけど昔の人が思い付いていいと思ったから書いたんだろう。
知らんけど昔の人が思い付いていいと思ったから書いたんだろう。
465デフォルトの名無しさん
2019/08/02(金) 12:51:11.15ID:hQ+yEyXN >>190 WindowsにJavaが入るかもって話あったの?そもそもそんな話すらなくね?
466デフォルトの名無しさん
2019/08/02(金) 13:50:46.03ID:pa9nweBb >>465
昔あったっしょ
Microsoft J++だったっけ?
JDirectとか言うCOMかActiveXコントロールかを直接呼び出せる機能拡張付きで、
それにSunがケチを付けて(確か)裁判沙汰になって、結局廃止になったやつ
TCKにも通らないだろうからJavaは名乗れないはずだけど
昔あったっしょ
Microsoft J++だったっけ?
JDirectとか言うCOMかActiveXコントロールかを直接呼び出せる機能拡張付きで、
それにSunがケチを付けて(確か)裁判沙汰になって、結局廃止になったやつ
TCKにも通らないだろうからJavaは名乗れないはずだけど
467デフォルトの名無しさん
2019/08/02(金) 13:54:51.56ID:xsQQm7uF >>465
90年代後半にだな・・・
90年代後半にだな・・・
468デフォルトの名無しさん
2019/08/02(金) 13:57:46.29ID:XJV5qmce 「マイクロソフトが Java に塩を混ぜた!」ってやつか
469デフォルトの名無しさん
2019/08/02(金) 20:32:46.34ID:hQ+yEyXN sedかなにかで↓
<td>
AAAA
</td>
<td>
BBBB
</td>
↑っていうデータのBBBを取り出したい。
残念なことにtdにIDやらなにやらが賦与されてないから手段としては
「1番目に表われた/<td>/<\/td>/は無視って2番目の/<td>/<\/td>/の中身を表示する」
っていうのになると思う。しかし方法が思い付かない……。
できればsed, awkあたりで処理できればいいなと思ってるんだけど,どなたか力を貸してほしい。
上のデータだけど,「実際はもっと複雑でtableが入れ子になってる」とかそういうことはないです。
<td>
AAAA
</td>
<td>
BBBB
</td>
↑っていうデータのBBBを取り出したい。
残念なことにtdにIDやらなにやらが賦与されてないから手段としては
「1番目に表われた/<td>/<\/td>/は無視って2番目の/<td>/<\/td>/の中身を表示する」
っていうのになると思う。しかし方法が思い付かない……。
できればsed, awkあたりで処理できればいいなと思ってるんだけど,どなたか力を貸してほしい。
上のデータだけど,「実際はもっと複雑でtableが入れ子になってる」とかそういうことはないです。
470デフォルトの名無しさん
2019/08/02(金) 20:38:11.21ID:cEuue6ob なら5行目を取り出せばいいじゃん
471デフォルトの名無しさん
2019/08/02(金) 20:40:10.25ID:2UnKye9C /^<td>$/{n;/BBB/p}
472デフォルトの名無しさん
2019/08/02(金) 20:44:47.38ID:O3iYpUQI 今までのレスからはそんな質問するはずがないとしか思えないんだけどw
<td>AAA
</td>
<td>
BBB</td>
なんぞリターンがあってもなくてもいいというhtml/xmlらしく、行がちゃんとしているわけではないとか?
<td>AAA
</td>
<td>
BBB</td>
なんぞリターンがあってもなくてもいいというhtml/xmlらしく、行がちゃんとしているわけではないとか?
473デフォルトの名無しさん
2019/08/02(金) 21:06:45.26ID:dUmy9lW0474デフォルトの名無しさん
2019/08/02(金) 21:06:52.97ID:XJV5qmce GNU sed の -z オプションを使って
$ sed -rz 's:.*</td>\n?<td>\n?(.*)</td>.*:\1:' data.html
$ sed -rz 's:.*</td>\n?<td>\n?(.*)</td>.*:\1:' data.html
475デフォルトの名無しさん
2019/08/02(金) 21:07:39.38ID:hQ+yEyXN476デフォルトの名無しさん
2019/08/02(金) 21:30:15.54ID:XJV5qmce GNU grep ならこんな感じ
$ grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
$ grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
477デフォルトの名無しさん
2019/08/02(金) 21:35:20.07ID:hQ+yEyXN478デフォルトの名無しさん
2019/08/02(金) 21:38:37.66ID:cEuue6ob 正直、CLIツール使って一発でやってしまおう!
なんて考えるから難しくなるんだよ。
一行一データになってないものは、
シェルスクリプトでやったほうが楽
#!/bin/sh
a=$(cat html.txt)
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
なんて考えるから難しくなるんだよ。
一行一データになってないものは、
シェルスクリプトでやったほうが楽
#!/bin/sh
a=$(cat html.txt)
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
479デフォルトの名無しさん
2019/08/02(金) 21:38:54.44ID:+p+nzQa3 >>475
>を>\nにして\n\nを\nにすればいいだけじゃないの?
>を>\nにして\n\nを\nにすればいいだけじゃないの?
480デフォルトの名無しさん
2019/08/02(金) 21:59:02.93ID:T1FFAKuC xmllint使えは禁句なの?
481デフォルトの名無しさん
2019/08/02(金) 22:00:05.58ID:G/LyK8vk Ruby なら、すべての改行を削除してから、最短マッチ
str = <<"EOT"
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT
str.delete!( "\n" ) # すべての改行を削除する
re = /<td>(.*?)<\/td>/ # ? は最短マッチ
p results = str.scan( re ).flatten
# ["AAAA", "BBBB"]
p results[ 1 ]
# "BBBB"
str = <<"EOT"
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT
str.delete!( "\n" ) # すべての改行を削除する
re = /<td>(.*?)<\/td>/ # ? は最短マッチ
p results = str.scan( re ).flatten
# ["AAAA", "BBBB"]
p results[ 1 ]
# "BBBB"
482デフォルトの名無しさん
2019/08/02(金) 22:47:11.19ID:hQ+yEyXN >>480
残念ながらそのHTMLは整形形式じゃないのでマトモに解析できないんです。
残念ながらそのHTMLは整形形式じゃないのでマトモに解析できないんです。
483481
2019/08/02(金) 23:15:30.78ID:G/LyK8vk Ruby で、nokogiri パーサーなら、
require 'nokogiri'
doc = Nokogiri::HTML( <<EOT.delete( "\n" ) ) # すべての改行を削除する
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT
elements = doc.css( "td" )
p elements.first.content #=> "AAAA"
p elements[ 1 ].content #=> "BBBB"
require 'nokogiri'
doc = Nokogiri::HTML( <<EOT.delete( "\n" ) ) # すべての改行を削除する
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT
elements = doc.css( "td" )
p elements.first.content #=> "AAAA"
p elements[ 1 ].content #=> "BBBB"
484デフォルトの名無しさん
2019/08/02(金) 23:29:54.36ID:pa9nweBb >>476
\Kじゃなくて(?<=..._)で書いたほうが読みやすくね?とか思ったけど
PerlやPCREじゃlookbehindに可変長になるパターンは指定できないのか
JavaScriptだと通るんだよね....
\Kじゃなくて(?<=..._)で書いたほうが読みやすくね?とか思ったけど
PerlやPCREじゃlookbehindに可変長になるパターンは指定できないのか
JavaScriptだと通るんだよね....
485デフォルトの名無しさん
2019/08/02(金) 23:34:34.72ID:cEuue6ob Ruby遅すぎるんだよ
$ time ruby html.rb
"AAAA"
"BBBB"
real 0m0.079s
user 0m0.079s
sys 0m0.000s
$ time sh html.sh
BBBB
real 0m0.002s
user 0m0.002s
sys 0m0.000s
$ time ruby html.rb
"AAAA"
"BBBB"
real 0m0.079s
user 0m0.079s
sys 0m0.000s
$ time sh html.sh
BBBB
real 0m0.002s
user 0m0.002s
sys 0m0.000s
486デフォルトの名無しさん
2019/08/02(金) 23:36:49.26ID:cEuue6ob これも遅いな。やっぱりシェルスクリプトが一番か
$ time grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
BBBB
real 0m0.003s
user 0m0.004s
sys 0m0.003s
$ time grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
BBBB
real 0m0.003s
user 0m0.004s
sys 0m0.003s
487デフォルトの名無しさん
2019/08/02(金) 23:38:32.60ID:cEuue6ob こうしたらさらに速くなったわw
シェルスクリプト最強伝説
#!/bin/sh
a="
<td>
AAAA
</td>
<td>
BBBB
</td>
"
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
$ time sh html.sh
BBBB
real 0m0.001s
user 0m0.001s
sys 0m0.000s
シェルスクリプト最強伝説
#!/bin/sh
a="
<td>
AAAA
</td>
<td>
BBBB
</td>
"
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
$ time sh html.sh
BBBB
real 0m0.001s
user 0m0.001s
sys 0m0.000s
488デフォルトの名無しさん
2019/08/02(金) 23:46:41.69ID:dUmy9lW0 >>487
スクレイピングする時にそんなコード毎回書くわけ?
スクレイピングする時にそんなコード毎回書くわけ?
489デフォルトの名無しさん
2019/08/02(金) 23:58:58.92ID:2UnKye9C a#*
a%% あたりがシェルスクリプト独自の難読パーツだが
覚えたら高速なのか...
a%% あたりがシェルスクリプト独自の難読パーツだが
覚えたら高速なのか...
490デフォルトの名無しさん
2019/08/03(土) 00:25:50.69ID:i7fqO3Sj491デフォルトの名無しさん
2019/08/03(土) 00:33:21.53ID:dYT3TwZL 自分は
キーボードの左側: # -> prefix
キーボードの右側: % -> suffix
で、削るんだっったっけ?残すんだったっけ?
結局毎回調べるという体たらく
キーボードの左側: # -> prefix
キーボードの右側: % -> suffix
で、削るんだっったっけ?残すんだったっけ?
結局毎回調べるという体たらく
492デフォルトの名無しさん
2019/08/03(土) 00:40:18.71ID:9AEx1UEu >>490
thanks
thanks
493デフォルトの名無しさん
2019/08/03(土) 00:57:31.70ID:37D8ZUar >>482
ブラウザでF12キーでコンソール開いて、
var q = (xml, query) => new DOMParser().parseFromString(`<xml>${xml}</xml>`, 'application/xml').querySelector(query).innerHTML.trim();
var text = q(`
<td>
AAAA
</td>
<td>
BBBB
</td>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
xmlとしてのパースだから、
q(`<chinko>AAAA</chinko><chinko>BBBB</chinko>`, 'chinko:nth-of-type(2)');
とかでも大丈夫。
一方htmlとしてもパースできるけど少なくともtableタグは補わなきゃならんね↓
var q = (html, query) => new DOMParser().parseFromString(html, 'text/html').querySelector(query).innerHTML.trim();
var text = q(`
<table>
<td>
AAAA
</td>
<td>
BBBB
</td>
</table>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
ブラウザでF12キーでコンソール開いて、
var q = (xml, query) => new DOMParser().parseFromString(`<xml>${xml}</xml>`, 'application/xml').querySelector(query).innerHTML.trim();
var text = q(`
<td>
AAAA
</td>
<td>
BBBB
</td>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
xmlとしてのパースだから、
q(`<chinko>AAAA</chinko><chinko>BBBB</chinko>`, 'chinko:nth-of-type(2)');
とかでも大丈夫。
一方htmlとしてもパースできるけど少なくともtableタグは補わなきゃならんね↓
var q = (html, query) => new DOMParser().parseFromString(html, 'text/html').querySelector(query).innerHTML.trim();
var text = q(`
<table>
<td>
AAAA
</td>
<td>
BBBB
</td>
</table>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
494デフォルトの名無しさん
2019/08/03(土) 03:42:42.10ID:eOXqQaf9495デフォルトの名無しさん
2019/08/03(土) 04:43:13.91ID:i7fqO3Sj >>494
俺含め日本人には#42みたいなのは馴染み薄いよね…
まあ「全く知らない概念」ではなかったから
とりあえず#は前,%は後,というように覚えられたけど。
コメントっていうのはいい案だと思う。
シェルスクリプトを書いている全員が把握できる概念だから。
俺含め日本人には#42みたいなのは馴染み薄いよね…
まあ「全く知らない概念」ではなかったから
とりあえず#は前,%は後,というように覚えられたけど。
コメントっていうのはいい案だと思う。
シェルスクリプトを書いている全員が把握できる概念だから。
496デフォルトの名無しさん
2019/08/03(土) 05:33:16.75ID:20yQPXqo ナンバナィン?
#はスーパーユーザで%はcshだな
#はスーパーユーザで%はcshだな
497デフォルトの名無しさん
2019/08/03(土) 06:07:39.94ID:l2kKbyZy シェルスクリプトの#と%はなんとなく使えてるが正規表現の前後読みは未だに無理ポ
498デフォルトの名無しさん
2019/08/03(土) 06:23:53.55ID:i7fqO3Sj 正規表現の割と新しめの拡張は
既存のメタ文字と被らないようになってるから類推しにくい記号になってしまってる場合が多い。
…まあ出典とかなくて俺の予想だけどw
最近だと「名前空間」的な概念が登場して\p{Kata}みたいな書き方が増えてきて助かる。
覚えるの簡単!
既存のメタ文字と被らないようになってるから類推しにくい記号になってしまってる場合が多い。
…まあ出典とかなくて俺の予想だけどw
最近だと「名前空間」的な概念が登場して\p{Kata}みたいな書き方が増えてきて助かる。
覚えるの簡単!
499デフォルトの名無しさん
2019/08/03(土) 08:10:24.89ID:GWDLl7Iz なんのこっちゃと思ったら.NETか
[:Katakana:]でいいんじゃないか。すでにあるからわかりやすいし
思惑でそうしてないんだろうけど
[:Katakana:]でいいんじゃないか。すでにあるからわかりやすいし
思惑でそうしてないんだろうけど
500デフォルトの名無しさん
2019/08/03(土) 09:10:18.89ID:i7fqO3Sj501デフォルトの名無しさん
2019/08/03(土) 09:11:02.22ID:i7fqO3Sj 逆に.NETでUnicodeロケールの正規表現が使えるとは思いもよらなんだ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★12 [蚤の市★]
- 女性天皇「賛成」69%、将来の皇位継承「不安」68%…読売世論調査 [蚤の市★]
- 不倫疑惑の永野芽郁さん、CM削除ドミノの違約金“やはり発生は免れない”可能性 約10億円になる見込み、本人は全額支払う覚悟 [牛丼★]
- 旧姓使用拡大に連合会長が反発 「何の説明もない。選択的夫婦別氏制度導入を」 男女共同参画会議 ★2 [ぐれ★]
- 開業4ヵ月でこれは…“国民の税金”投入の『ジャングリア沖縄』で見た衝撃的な光景と、モチベーションが低い一部スタッフの現状 ★2 [ぐれ★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 【悲報】中学受験、意味がなかった…「中学受験をやっても大部分の子供は無勉で入れるMARCH地方国立大に行くのが精一杯です [483447288]
- ジムでインターバルの時にウロウロ歩くやつなんなの?
- レイプはとっても気持ちがいい
- 【悲報】ドイツ人「なんで日本人って自炊するの?出来合の惣菜や冷食食った方が楽でコスパいいやん。そんなんだから低生産性なんだよ [786648259]
- 大阪行くわよーーーッ!!!
- 近所の騒音おじさんが俺にだけ優しくしてくる
