Unix bash/ksh: ファイルの特定の行で、空白ではなく最初の文字を選択します。

Unix bash/ksh: ファイルの特定の行で、空白ではなく最初の文字を選択します。

file1.txt次の内容を含むファイルがあります。

Date List
-----------
    Quarter Date
         Year Date
             Month Date

さて、ファイルの各行から空白以外の要素を読み込み、変数に書きたいと思います。たとえば、2行目の場合は、Quarter Yearスペースを削除した後にのみ変数を含める必要があります。

私は試した:

tail -1 file1.txt > variable1

しかし、これはうまくいきません。

答え1

使用sed:

variable1="$(< inputfile sed -n '3s/ *//p')"
  • variable1="$([...])":サブシェルでコマンドを実行し、[...]その出力を変数に割り当てます。$variable
  • < inputfile:コンテンツを「s」inputfileにリダイレクトします。sedstdin
  • -n: 出力抑制

sedコマンド分解:

  • 3: 入力の 3 行目でのみ、次のコマンドを実行するようアサートします。
  • s: 置換を実行するためのアサーション
  • /: 検索モード開始
  • *:0個以上の文字と一致します。
  • /:パターン検索を停止/文字列置換を開始
  • /:文字列の一時停止(実際には何も交換されません)/修飾子の開始
  • p:交換に成功したラインのみ印刷

答え2

まず、必要な行を変数として読み込みます(例では3行)。

var=$(sed -n '3p' file1.txt)

sedコマンドはpファイルの3行目を印刷します()。ストリップ先行スペースを使用パラメータの置換:

echo "${var#"${var%%[![:space:]]*}"}"

内部置換とは、前のスペースを除くすべてを削除することを意味します。外部置換は行の先頭のスペースを削除します。

出力は次のとおりです

Quarter Date

答え3

tail -1 file1.txt > variable1ファイルに書き込みますvariable1

代わりに、コマンドの置き換え(bash.info 3.5.4、POSIX sh)を使用してください。

variable1="$(tail -1 file1.txt)"

ちなみに、cygwinの私のGNUテールバージョンにはこのオプションはありません-1。代わりに、以下を使用してくださいsed

# EREGEX: Replace all whitespace at beginning of line
# NOTE: BSD sed uses a different flag to enable EREGEX, -E.
# EDIT: Dropped -r. \s is already included in BRE.
#       Thanks to kos for pointing that out.
# EDIT: Use POSIX [:space:] instead of Perl \s.
variable1="$(sed -e 's/^[[:space:]]*//g' < file1.txt)"

ライン選択と組み合わせる:

# EDIT: limit the [s]ubstitude operation to the 4th line only, and
#       [p]rint directly from s.
variable1="$(sed -ne '4s/^[[:space:]]*//p' < file1.txt)"

答え4

そしてksh/ zsh/ bash

IFS=' ' read -r variable < <(tail -n 1 file)

read先行および末尾の空白文字の削除空白が見つかった場合IFS(デフォルトではタブと改行で)

次のようにすることもできます。

while IFS=' ' read -r variable <&3; do
  something with "$variable"
done 3< file

ファイルを1行ずつ処理します(これは通常シェルを使用する方法ではありませんが、)$variable現在の行の内容を保持し、先頭と末尾の空白文字を削除します。

関連情報