ラベル sed の投稿を表示しています。 すべての投稿を表示
ラベル sed の投稿を表示しています。 すべての投稿を表示

2018年10月26日金曜日

"ls -l"出力からファイルサイズ列を取り出す

2018 Oct. 26.


$ ls -l | awk 'NR > 1 ' | sed -e "s/[ $'\t'][ $'\t']*/ /g" | cut -d " " -f 5

  [ $'\t'] : スペースもしくはタブ($'\t')

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

2017年11月19日日曜日

sedの先頭行番号は1

sedの先頭行番号は1

シェルスクリプト, shell script
2018 Jan. 22.
2017 Nov. 19.


先頭行の番号:1