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}"