rokkonet
2018年7月29日日曜日
bashならできる変数内文字列置換
2018 Jul. 29.
${変数名/置換前文字列/置換後文字列}
最初に一致した部分のみを置き換える。
${変数名/置換前文字列//置換後文字列}
すべての一致部分を置き換える。
bash 文字列の末尾の削除
2018 Jul. 29.
bashでの文字列Strの末尾の削除
echo ${Str/%?/}
2018年7月28日土曜日
grub2の起動ディスクMGRへのインストール
2018 Jul. 28.
/と/bootが同じパーティションの場合
# grub-install /dev/HDD
/と/bootが異なるパーティションの場合
# grub-install --root-directory=/ /dev/HDD
ubuntu系でのビデオカードと利用ドライバの調べ方
2018 Jul. 28.
ビデオカード
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:0d.0 ==
modalias : pci:v000010DEd000003D0sv00001028sd0000020Ebc03sc00i00
vendor : NVIDIA Corporation
model : C61 [GeForce 6150SE nForce 430] (Inspiron 531)
driver : nvidia-304 - third-party free recommended
driver : xserver-xorg-video-nouveau - distro free builtin
ドライバ
$ lshw -c video 2>&1 | grep driver
設定: driver=nouveau latency=0
NFSクライアント設定
2018 Jul. 28.
xubuntu18.04, xubuntu16.04
portmap をインストールし、再起動する
# apt-get install portmap nfs-common
# shutdown -r now
/etc/fstab へ書き込む
HOST:/DIR /CLIENT-DIR nfs rw,noatime,intr,hard 0 0
2018年7月21日土曜日
シェルスクリプト 文字列から先頭の1文字を削除した上で、直前が\もしくは"ではない"までを最短一致で削除する
2018 Jul. 21.
bash上で、文字列Lineから先頭の1文字を削除した上で、直前が\もしくは"ではない"までを最短一致で削除する
LeftLine=${Line:1:$(( ${#Line} - 1 ))} # 先頭文字削除
DelStr=$(echo $LeftLine | grep -oP -e '^.*?[^\\"]"[^"]') # 最短一致削除文字列取得
DelStr=${DelStr/%?/} # 余分に取得した末尾文字を削除
DelStr=$(echo $DelStr | sed -e 's/\\/\\\\/g') # \を\でエスケープし\\に
echo $LeftLine | sed -e s/${DelStr}// # 削除実行
${parameter/pattern/string}
パターンの置換。 pattern が展開され、 パス名展開の場合と同じようなパターンを作ります。 parameter の展開が行われ、 その値のうち pattern に最長一致する部分が string に置換されます。 pattern が / で始まる場合には、pattern に マッチした部分は全て string に置換されます。 そうでない場合には、最初にマッチした部分だけが置換されます。 pattern が # で始まる場合には、パターンは parameter を展開した値の先頭にマッチしなければなりません。 pattern が % で始まる場合には、パターンは parameter を展開した値の末尾にマッチしなければなりません。 string が空の場合には pattern にマッチした部分は削除されます。 またこの場合には、pattern の後に続く / は省略可能です。 parameter が @ または * である場合、置換操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 置換操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
シェルスクリプト 文字列から直前に\(バックスラッシュ)が無い"(二重引用符)までを削除する
2018 Jul. 21.
Srch=$(echo $Line | grep -oP '^.*?\\".*?[^\\]"' | sed -e 's/\\/\\\\/g')
echo $Line | sed -e s/${Srch}//
「直前に\(バックスラッシュ)が無い"(二重引用符)まで」の検索
原形 ^.*?\".*?[^\]"
grepに使う時 '^.*?\\".*?[^\\]"'
sedに使う時 '^.*?\\".*?[^\\]"'
sedの検索文字列内での\(バックスラッシュ)
'(シングルクォーテーション)で囲むと
シェルではそのまま読み込まれて
sedにおいて\(バックスラッシュ)が状況に応じてエスケープ文字に解釈される
'(シングルクォーテーション)で囲まないと
シェルで読み込まれる時に\が状況に応じてエスケープ文字に解釈され
sedにおいても\が状況に応じてエスケープ文字に解釈される
\をたくさん書く必要がある
2018年7月20日金曜日
sedでのバックスラッシュの扱いについて
2018 Jul. 20.
2018 Jul. 19.
sedの s/regexp/replacement/ におけるregexp内の文字としての\には\\とエスケープする必要がある。
ケースA(bash上のsedでうまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"ddadf\"ab"'
echo $Str | sed -e s/${Search}//
結果: "wr\"ddadf\"ab",a
(期待していた結果: ,a )
(検索文字列Searchを短くしていくと)
ケースB(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"ddadf\'
echo $Str | sed -e s/${Search}//
結果: sed: -e expression #1, char 15: `s' コマンドが終了していません
ケースC(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\"ddadf\\'
echo $Str | sed -e s/${Search}//
結果: "ab",a
ケースD(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"d'
echo $Str | sed -e s/${Search}//
結果: "wr\"ddadf\"ab",a
(期待していた結果: dadf\"ab",a )
ケースE(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\"d'
echo $Str | sed -e s/${Search}//
結果: dadf\"ab",a
ケースF(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"'
echo $Str | sed -e s/${Search}//
結果: "wr\"ddadf\"ab",a
(期待していた結果: ddadf\"ab",a )
ケースG(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\"'
echo $Str | sed -e s/${Search}//
結果: ddadf\"ab",a
ケースH(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\'
echo $Str | sed -e s/${Search}//
結果: sed: -e expression #1, char 8: `s' コマンドが終了していません
考察:次のケースFとの違いは\なので、\が続く/のエスケープ文字に解釈されているのか?
ケースI(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\'
echo $Str | sed -e s/${Search}//
結果: "ddadf\"ab",a
ケースJ(うまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr'
echo $Str | sed -e s/${Search}//
結果: \"ddadf\"ab",a (期待どおり)
2018年7月17日火曜日
grep 文字列の先頭から、直前に\が無い"(二重引用符)までの文字列の最短一致検索
2018 Jul. 20.
2018 Jul. 19.
2018 Jul. 17.
文字列の先頭から、直前に\(バックスラッシュ)が無い"(二重引用符)までの文字列の最短一致検索
$ grep -oP '^.*?\\".*?[^\\]"'
-P で最短一致が可能なPearl正規表現とし、検索文字列中の?で最短一致指定、-o で一致文字列を出力
変数への結果格納
$ Result=$(echo $Str | grep -Po '^.*?\\".*?[^\\]"')
シェル シングルクォーテーションで囲んだバックスラッシュ、アスタリスク*、二重引用符"(ダブルクォーテーション)の扱い
2018 Jul. 17.
シェルでのシングルクォーテーションで囲んだ文字列では、
\は\\と記し
*や"はそのまま記す。
$ echo $String | grep '^.*\\"'
grepでの最短一致検索
2018 Jul. 21.
2018 Jul. 17.
grepに -P オプションを付ける
最短一致可能なPearl正規表現が利用可能となる
検索文字列に ? を付ける
?に続く文字列の最短一致となる
(最左最短一致なので検索文字列の先頭には注意が必要)
qiita.com/anqooqie/items/191ad215e93237c77811
先頭からabまでの最短一致検索
$ echo adabfdabdfaabd | grep -P '^.*?ab'
-o オプションを付けると、行全体ではなく、マッチした文字列だけが1行1文字列で出力される。
$ echo adabfdabdfaabd | grep -Po '^.*?ab'
2018年7月8日日曜日
grepの検索文字列に$(ドル記号)を含める方法
2018 Jul. 08.
rcmdnk.com/blog/2013/10/28/computer-bash-linux/
bash上でのgrepで検索文字列に$(ドル記号)を含める方法
$を含む文字列の検索
ドル記号($)は変数の参照に使われるため、エスケープせずに単純にこれを書くと続く文字列の変数を 参照する様な形になって、大概の場合は未定義変数=空文字で 全ての行が該当してしまう。
ドル記号をエスケープしてダブルクォートするか、シングルクォートで囲むことで囲み内を展開しないようにする。
grep "\$abc"
grep '$abc'
$のみの検索
grep "\\$"
grep '\$'
シェルスクリプトの位置パラメータ/コマンドライン引数の一括展開
2018 Jul. 08.
fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html
"$*"
すべての値の間にスペース ` ` が差し込まれた1つの文字列に展開される。
展開の結果は元にように個別の値にはならず、スペースが差し込まれたひと塊の一つの値になる。
ダブルクォートに括られているため、展開後にワード分割はされない。
同様にパス名展開やブレース展開なども適用されない。
"$@"
位置パラメータの数だけ展開される。
パラメーターの数は変化しない。
ワード分割や各種展開もされない。
$* と $@ は同じ
位置パラメータの各値がそれぞれ個別に展開された後、個別にワード分割やパス名展開などが適用される。
2018年7月7日土曜日
文字列がマッチする数をカウントするシェルスクリプト
2018 Jul. 07.
server.etutsplus.com/shell-script-substr-count/
(1) 検索対象文字列から検索する文字列を見つけて改行文字「\n」を付けてマッチする数を行数にする
(2) "grep -c"で検索する文字列が何回現れるかカウントする
echo $Line | sed "s/${Str}/${Str}\n/g" | grep -c "${Str}"
新しい投稿
前の投稿
ホーム
登録:
投稿 (Atom)