cshのスクリプトを書いているのですが、ある文字列から文字列を取得するにはどうしたらよいでしょうか?
具体的には、
aaaaaaabbbbb という文字列があってここから aaaaaaa だけ取り出すには
どうすればよいでしょうか?
ただし、aの文字は可変でbは固定の文字列です。

A 回答 (3件)

補足されたので補足返しというこって



最後のbbbの部分の文字列長が固定でないとすると

sed 's/[b]*$//g'

でいけるはず。

もめるのももともとの文字列フォーマットがあきらかでないからだと思うので、文字列フォーマットを説明できる程度によく考えましょう。

それを正規表現にできれば(shell,sed)スクリプトなどできたも同然です。awkやperlで制御構造をもたせる場合はもう少しかかりますが。
今後のためにも正規表現を勉強しましょう。
    • good
    • 0

No.1 の回答を(勝手に (^^;)補足します。



basename コマンドは、パスからファイル名を取り出す目的で作られているので、
"/" があると、それより前の文字を削除します。なので、

% basename aaa/ccccccbbbbb bbbbb
cccccc

となります。質問にある「aの文字は可変」が "/" を含まない場合じゃないと
使えません。

また、sed を使うケースとして挙げられた

mph> echo "aaaaaaabbbbb" | sed 's/b//g'

は、「b を全て削除する」という形です。
文字列のお尻に決った文字があって、それを削除する、の一般的な形は

% echo "aaaaaaabbbbb" | sed 's/bbbbb$//'

となります。


これだけじゃああんまりなんで、無理矢理、私のオリジナルの回答をつけておきましょう。
awk を使うケースです。

% echo "aaaaaaabbbbb" | awk '{ sub( /bbbbb$/, "" ) ; print }'

# ちなみに、私が同じ立場にあれば、迷わず sed を使います
    • good
    • 0

shellのビルトインだけでやる場合はパスします。



bbbbbの部分がファイル名の拡張子などのように文字と長さの両方が固定した文字の場合はbasename使えばできると思います。

basename aaaaaaabbbbb bbbbb

もし、bbbbbが文字固定かつ長さ不定の場合はsedでできます。

echo "aaaaaaabbbbb" | sed 's/b//g'

でどないでしょ?

文字列フォーマットの情報が乏しいので確信をもってアドバイスできません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qcshのパス名指定子

cshプログラムの :t(:gt, :h ...)などパス名指定子の仕様に関して教えて頂きたく思い投稿いたしました。
これらの演算子はフルパス表示からフアイル名部の文字列を
取り出す際に(/bin/ls-->ls)単に最後のスラッシュより前の部分を省略するという処理ではないのでしょうか?

例1のような場合はOKなのですが例2のような場合は利かないのです!!
変な引数を与えられた場合にバッチスクリプトの使い方をechoするところで$0を使いたいのですが、このコマンドはどのような場所から実行されるか分からないので、:t を用いてバッチファイル名だけを表示させたいと思っています。


[1: OK例]
set qqq = (/opt/sfw/etc/* )
echo "$a:gt"
-<結果>---
enscript.cfg
esd.conf
fnrc
ftpaccess
ftpconversions
...

[2: NG例]
test.csh
#! /bin/csh -f
echo "usage of $0:t"

--<結果> ---
usage of /export/home/matumoto/study/csh/dirFlag.csh:t

以上、宜しくお願いいたします。
※ 作業はsolaris 8で行っています。

cshプログラムの :t(:gt, :h ...)などパス名指定子の仕様に関して教えて頂きたく思い投稿いたしました。
これらの演算子はフルパス表示からフアイル名部の文字列を
取り出す際に(/bin/ls-->ls)単に最後のスラッシュより前の部分を省略するという処理ではないのでしょうか?

例1のような場合はOKなのですが例2のような場合は利かないのです!!
変な引数を与えられた場合にバッチスクリプトの使い方をechoするところで$0を使いたいのですが、このコマンドはどのような場所から実行されるか分からないので、:t ...続きを読む

Aベストアンサー

#2さんの回答(後者のほう)でOKです。
>set a = $0
>echo "usage of $a:t"

他にも、/usr/bin/basenameを使うという手もあります。
echo "usage of `basename $0`"
Bシェル等ではこの方法ですね。

$0には、:tなどの修飾子が効かないようです。
ちなみに引数の$1($argv[1])は修飾子は効きます。
#$0はシェル変数ではないから?

QUNIXのcshについて。

ちょっとここに質問していいものか迷いましたが、
このカテゴリで質問させていただきます。

UNIXのCシェルで、あるシェル変数に1行分のデータが
読み込まれていて、これをいくつかのデータがタブ
区切りで入っています。

これを違う複数の変数に各データを切り分けて入れた
いのですが、どうしたらいいかわかりません。
awkやsedという手を考えたのですが、あれはファイルから
読み込むので、できませんでした。

わかる方がいらっしゃればよろしくお願いします。

Aベストアンサー

例えば変数wholevalueに
set wholevalue = 'Monroe female actress'
という具合に入っていたとします。
この時、
set eachvalue = `echo $wholevalue`
とすると、(シングルクォートとバッククォートの違いに注意)
eachvalueは変数の配列になります。
set name = $eachvalue[1]
set sex = $eachvalue[2]
set occupation = $eachvalue[3]
とすると、$name, $sex, $occupation に、Monroe, female, actress が
それぞれ入ります。

Qcsh (tcsh)での環境変数の長さの制限について教えて下さい。

Solaris8 (SPARC)上でJavaでいろいろ開発をしているのですが、
シェルの環境変数の長さに制限があるようで困っています。
具体的には、あちこちに散在しているjarファイルを参照する必要
があるので、環境変数 $CLASSPATHが非常に長くなっていて、
現在の設定以上に CLASSPATHを追加しようとすると「Word too long」
というエラーが出て設定できません。
1つの環境変数の長さの制限を変更することは可能でしょうか?
もしくはなにか回避策があれば教えて下さい。
使用しているシェルは tcsh です。

Aベストアンサー

参考URLに tcsh の man を示します。
ここの最後の方に「制限」という章がありますが、そこにある
「単語は1024文字まで」という制限に引っ掛かってるんでしょうね。

まあ、tcsh であれば、ソースが有るわけですから、ソースを
いじってしまえば良いですよね。

もしくは、コンパイルや実行の際には bash を使う。コンパイルで
make を使っているんだったら、そこでシェルを指定すれば良いだけ
ですよね。

参考URL:http://www.linux.or.jp/JM/html/tcsh/man1/tcsh.1.html

Qエクセルで(1)文字列の中からひらがなだけを削除(2)文字列の中からカタカナだけを削除 する方法

エクセルで
(1)文字列の中からひらがなだけを削除
(2)文字列の中からカタカナだけを削除

する方法がないかと探していますがわかりません。
当方、エクセル初心者ですので、マクロに関しての知識もあまりありません。関数に関しては知識はあるのですが、関数ではどうにもなりません。


イメージとしては
  変更前                 変更後
 あさ、アサ、ひる、ヒル、よる、ヨル   あさ、ひる、よる


とこのように、カタカナだけを削除して「、」は残したいです。
このような方法が誰かお分かりでしたら教えていただけたら幸いです。
また、この逆(ひらがなだけを抜く)も教えていただきたいです。

Aベストアンサー

文字列の長さによっては膨大な作業セルが必要ですが
カタカナを削除する場合
・文字列を一文字ずつ別セルに取り出す
・CODE関数でコードに変換
・変換したコード9331以下の物だけをCHAR関数文字に変換、9332以上は""に変換
・連続した[ 、]を""に変換
・文字を結合し文字列に戻す

こんな作業で関数のみで出来ます。

ひらがなを削除する場合は9250~9331までを""に変換になります。

Qcshでのリンクファイルの存在確認方法

cshで

if (-f ***) then
endif

とすると *** というファイルが存在するかどうか調べられますが、*** というファイルが、リンクファイルかどうか調べるにはどうすればよいですか?

Aベストアンサー

/bin/sh なら

if test -L ***
then xxxxxxxxx
fi
ですね。
cshはログインシェルとして使うだけならまだしも、スクリプトを書くのには機能が貧弱なので、/bin/sh か /bin/bash 等を使ったほうがいいでしょう。testはビルトインコマンドです。


人気Q&Aランキング

おすすめ情報