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
にリダイレクトします。sed
stdin
-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
現在の行の内容を保持し、先頭と末尾の空白文字を削除します。