タグ付けされた質問 「string」

文字列操作:文字列の一部の抽出、テキストの置換、特定の幅へのフォーマットなど


2
シェルでのJSON解析
シェルでJSON出力を解析するにはどうすればよいですか? たとえば、Amazon Webサービスには、インスタンスのステータスを取得するためのCLIが用意されています。 $ aws ec2 describe-instances <my_instance_id> しかし、コマンドはJSON文字列を返します。このコマンドの出力は次のようになります。 $ aws ec2 describe-instances x12345 { "Reservations" : { "OwnerId": "1345345" "Groups": [], "SecurityGroups": [ { "Foo" : "yes" "Bar" : "no } ] } } JSON出力の解析に使用できるシェルの組み込みはありますか? たとえばFOO、次のシェル変数にキャプチャしたいとしますoutput["Reservations"]["SecurityGroups"][0]{"Foo"}。 それが役立つ場合、私は特にZshで動作するソリューションに興味があります。
11 zsh  string  json 

4
文字列変数の行数をPOSIXで数える方法は?
私はこれをバッシュでできることを知っています: wc -l <<< "${string_variable}" 基本的に、私が見つけたものはすべて<<<Bashオペレーターに関係していました。 しかし、POSIXシェルで<<<はは定義されておらず、何時間も別のアプローチを見つけることができませんでした。これには簡単な解決策があると確信していますが、残念ながら今のところ見つかりませんでした。

6
bash文字列で始まる行を見つける
たくさんのファイルがあり、特定の文字列で始まる連続した行が含まれているファイルを見つけたい。 たとえば、次のファイルの場合: Aaaaaaaaaaaa Baaaaaaaaaaa Cxxxxxxxxx Cyyyyyyyyy Czzzzzzzzz Abbbbbbbbbbb Bbbbbbbbbbbb Caaaaaa Accccccccccc Bccccccccccc Cdddddd Ceeeeee 「C」で始まる行が複数あるので、このファイルをコマンドで見つけたいと思います。 たとえば、次のファイルの場合: Aaaaaaaaaaaa Baaaaaaaaaaa Cxxxxxxxxx Abbbbbbbbbbb Bbbbbbbbbbbb Caaaaaa Accccccccccc Bccccccccccc Cdddddd 「C」で始まる行は常に1つあります。このファイルは必要ありません。a grepやa の使用を考えましたsedが、正確な方法がわかりません。多分正規表現^C.*$^Cかそのようなものを使用しています。何か案が ?
10 bash  sed  grep  string 

5
bashのパス名のパターンマッチング
ディレクトリ内のサブディレクトリのリストを操作したい。検討してください: for x in x86-headers/*/C/populate.sh; do echo $x; done これは与える x86-headers/elf/C/populate.sh x86-headers/gl/C/populate.sh x86-headers/gmp/C/populate.sh x86-headers/gnome2/C/populate.sh x86-headers/gtk2/C/populate.sh x86-headers/jni/C/populate.sh x86-headers/libc/C/populate.sh しかし、私は対応して経路の第2の部分に、という値が欲しい elf、glなど私が大手を取り除く方法を知っているがx86-headers。 for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done 与える elf/C/populate.sh gl/C/populate.sh gmp/C/populate.sh gnome2/C/populate.sh gtk2/C/populate.sh jni/C/populate.sh libc/C/populate.sh また、パスの後半の用語を取り除く方法も知っています。つまり、1レベル下がっています。 cd x86-headers for x in */C/populate.sh; do i=${x%%/*}; echo $i; done 与える elf …


2
コマンドを動的に作成する
私はスクリプトで作業しており、tarコマンドを動的に作成する必要があります。 ここに私が何をしようとしているのかを説明する2つの例があります: #!/bin/bash TAR_ME="/tmp" EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*") _tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" echo -e "\n\nNEXT:\n\n" EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*") _tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" _tarコマンドとして使用できるようにしたいのですが、クラシックパスで機能させることができましたが、フォルダ名のスペースを操作する必要があります。そして、毎回次のようなエラーが発生しました: COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" -zcf tmp.tar.gz …

4
/ bin / shのコロンで文字列を分割
私のdashスクリプトはの形式でパラメータを受け取りますhostname:port。つまり、 myhost:1234 一方、ポートはオプションです。 myhost ホストとポートを別々の変数に読み込む必要があります。最初のケースでは、私は行うことができます: HOST=${1%%:*} PORT=${1##*:} しかし、ポートが省略されている場合、それは2番目のケースでは機能しません。echo ${1##*:}空の文字列ではなく、単にホスト名を返します。 バッシュでは、私はできる: IFS=: read A B <<< asdf:111 しかし、それはでは機能しませんdash。 私は、上の文字列を分割することができ:、外部プログラムを(起動せずに、ダッシュではawk、trなど)?
9 shell  string  dash 

5
/ path / to / fileを/ p / t / fileに短縮する方法
awk各親/中間レベルの最初の文字を使用して、完全なベース名を使用して、Unixパスの文字列を短くするエレガントなワンライナー(例:)を探しています。例で示す方が簡単: /path/to/file → /p/t/file /tmp → /tmp /foo/bar/.config/wizard_magic → /f/b/./wizard_magic /foo/bar/.config/wizard_magic→ /f/b/.c/wizard_magic 以下の@MichaelKjörlingおよび@ChrisHによる良い点を考慮して、この例では、最初の文字がドットの場合に最初の2文字を表示する方法を示しています。
9 sed  awk  string 

4
文字列に改行文字があると断言し、もしあれば、それを削除する方法
私が制御できない何らかの操作の結果である文字列があります。を使用してこの変数を出力するとecho、次のようになります。 echo $myvar hello しかし、私がするとき if [ $myvar = "hello" ]; then echo they are equal else echo they are not equal fi それらが等しくないことは常にわかります。これはnewlineキャラクターのせいだと思います。 文字列も奇妙に動作します。私がする時: newVAR="this is my var twice: "$myvar$myvar echo $newVAR 私は得ます: hellois my var twice: hello これが原因であるかどうかを確認し、原因newlineである場合は削除するにはどうすればよいですか?
9 bash  string 

2
パイピングbash文字列操作
私は他のいくつかのパイプbash文字列操作の質問を読みましたが、それらは特殊なアプリケーションのようです。 基本的に、以下をより簡単にする方法はありますか? の代わりに $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD 何かのようなもの $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD 編集私は速度を維持するために可能であればbash操作内に留まることに興味があります(スクリプトを大幅に遅くする傾向があるsed / awkとは対照的に) Edit2:@jimmij 私は2番目の例が好きで、関数を作成することにしました。 bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; } echo hello world | bash_m …

4
bashのみを使用して単一の文字列を文字配列に分割する
私はbashのみを使用して配列に分割'hello'したいのですがh e l l o、sedでそれを行うことができますsed 's/./& /g'が、区切り文字が何であるかわからない場合、または区切り文字が任意の場合に、文字列をBashの配列に分割する方法を知りたいです単一の文字。${i// /}区切り文字が不明なため、ある程度の創造性がなければ使用できないと思います。また、式が正規表現を受け入れるとは思いません。[[string =〜([az]。)。*]]でBASH_REMATCHを使用してみましたが、期待どおりに動作しません。ある種string.split()の動作を達成するためにbashのみを使用する適切な方法は何ですか?その理由は、すべてのbashでrevユーティリティーを記述しようとしているためです。 while read data; do word=($(echo $data|tr ' ' '_'|sed 's/./& /g')) new=() i=$((${#word[@]} - 1)) while [[ $i -ge 0 ]]; do new+=(${word[$i]}) (( i-- )) done echo ${new[@]}|tr -d ' '|tr '_' ' ' done しかし、私はtrとsedを使用しました。分割を適切に行う方法を知りたいので、すべてbashになるように修正します。楽しみのためだけに。
9 bash  string  split 

2
マッチの周囲の文字をgrep
巨大なデータベースダンプ内で検索と置換を行いたいと思っていますが、それは私が発生するはずの動作をしていません。ファイル内のターゲット文字列をgrepして、周囲の8文字程度を確認したいと思います(場合によっては、その数値を調整する必要があるかもしれません)。どうやってやるの? 私が目を見張ることができない理由は、何千とは言わないまでも何百ものマッチがあるからです。文字列を囲むいくつかの文字を取得し、それをuniq何かにパイプして、検索と置換で予期しない動作が発生する理由を確認します。 また、同じ行に複数のマッチがある可能性があります!

2
変数に改行が含まれているかどうかをテストします(POSIX)
一部のシェルはこの種のテストを受け入れることを知っています: t() { [[ $var == *$'\n'* ]] && res=yes || res=no printf '%s ' "$res"; } var='ab cd' t var='abcd' t echo 実行時: $ bash ./script yes no POSIX(ダッシュ)と同等の機能とは 以下は信頼できるテスト方法ですか? nl=' ' t() { case "$var" in *$nl* ) res=yes ;; * ) res=no ;; esac printf '%s ' …

4
文字列の一部を変数に抽出するにはどうすればよいですか?
次のようなファイルの行があります。 attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks... 私は、抽出したい512^3、16^3、32^3および800それからの4つの数字と4つの変数にそれぞれ割り当てるlevel、grid、boxesおよびtasksその他の使用のために。 これどうやってするの?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.