sedを使用して、1行に1つ以上のパターン文字を含む文字列を表示し、他の文字列は無視します。

sedを使用して、1行に1つ以上のパターン文字を含む文字列を表示し、他の文字列は無視します。

結果を伝えたいです。sed コマンドファイルの各行の一部のみを読みたい場合は、変数に追加します。たとえば、「fic1.txt」という入力ファイルの内容は次のとおりです。

-->猫小説1.txt:

/data/test/AAAA1.txt: text/plain; charset=us-ascii
/data/test/AAAA2.txt: text/plain; charset=us-ascii
/data/test/AAAA3.txt: text/plain; charset=us-ascii
/data/test/BBBB1.txt: text/plain; charset=iso-8859-1
/data/test/BBBB2.txt: text/plain; charset=iso-8859-1
/data/test/BBBB3.txt: text/plain; charset=iso-8859-1
/data/test/BBBB4.txt: text/plain; charset=iso-8859-1
/data/test/CCCC1.txt: text/plain; charset=iso-8859-1
/data/test/CCCC2.txt: text/plain; charset=unknown-8bit

だから私は使いたいsed は結果を変数に渡します。、例えば:

->出力結果1:

us-ascii
us-ascii
us-ascii
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
unknown-8bit

->出力結果2:

/data/test/AAAA1.txt
/data/test/AAAA2.txt
/data/test/AAAA3.txt
/data/test/BBBB1.txt
/data/test/BBBB2.txt
/data/test/BBBB3.txt
/data/test/BBBB4.txt
/data/test/CCCC1.txt
/data/test/CCCC2.txt

最初の出力では、次のsedコマンドを使用しました。

var_type_fic=`cat fic1.txt |sed -r 's/.*charset=([^ ]+).*/\1/'|sort`

for fic in $var_type_fic; do
   echo "$fic"
done

しかし、2番目のケースでは、よく一致する正規表現の一致が見つかりません。誰でも助けることができますか?

答え1

間違ったツールを使用しています。読むman cut

cut -d= -f2 fic1.txt
cut '-d:'  -f1 fic1.txt

それは簡単です。

答え2

これは最も単純なcut行為を果たした回答に表示されたウォーチナーしかし、あなたが解決策を求めたので、sed以下はそのうちの1つです。

#n
# The above turns off the default output, just like using -n on the
# command line would do (#n must be the first two characters of the
# script).

# Save the original line to the hold space.
h

# Remove all up to and including the last equal sign.
# Write the modified text to "Output_result1".
s/.*=//
w Output_result1

# Fetch the original line from the hold space.
g

# Remove all from and including the first colon.
# Write the modified text to "Output_result2".
s/:.*//
w Output_result2

テストしてみてください:

$ sed -f script file
$ cat Output_result1
us-ascii
us-ascii
us-ascii
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
unknown-8bit
$ cat Output_result2
/data/test/AAAA1.txt
/data/test/AAAA2.txt
/data/test/AAAA3.txt
/data/test/BBBB1.txt
/data/test/BBBB2.txt
/data/test/BBBB3.txt
/data/test/BBBB4.txt
/data/test/CCCC1.txt
/data/test/CCCC2.txt

別のスクリプトを使用せずに:

sed -n  -e h -e 's/.*=//' -e 'w Output_result1' \
        -e g -e 's/:.*//' -e 'w Output_result2' file

実際の計画によって異なる使用このデータの場合、データをシェル変数として直接読み取ることができます。区切り文字として:andを使用すると、=単純なループでこれを行うことができます。

#!/bin/sh

while IFS=':=' read -r pathname junk charset
do
        printf 'pathname="%s"\tcharset="%s"\n' "$pathname" "$charset"
done <file

与えられたデータに対して以下が出力されます。

pathname="/data/test/AAAA1.txt" charset="us-ascii"
pathname="/data/test/AAAA2.txt" charset="us-ascii"
pathname="/data/test/AAAA3.txt" charset="us-ascii"
pathname="/data/test/BBBB1.txt" charset="iso-8859-1"
pathname="/data/test/BBBB2.txt" charset="iso-8859-1"
pathname="/data/test/BBBB3.txt" charset="iso-8859-1"
pathname="/data/test/BBBB4.txt" charset="iso-8859-1"
pathname="/data/test/CCCC1.txt" charset="iso-8859-1"
pathname="/data/test/CCCC2.txt" charset="unknown-8bit"

関連情報