この特定の場合に「sed」コマンドを正しく使用する方法

この特定の場合に「sed」コマンドを正しく使用する方法

各行の形式は次のとおりです。 names.txtファイルがあります。

xxxxxx   random_string_of_characters    2015

xxxxxxが6桁の数字の場合、random_string_of_charactersは次のようになります。何もない。各文字列が次のように見えるように、各行のxxxxxxと2015の間のすべてのスペースとrandom_string_of_charactersを置き換えるには、置換コマンドを使用したいと思います。

xxxxxx 2015

それでは、これを達成するための最良の方法は何ですか?

答え1

あなたはできます

sed -i -e 's/[[:space:]]\+.\+2015$/ 2015/' names.txt

同じファイルに保存したい場合。-i標準出力にのみ印刷するには、標準出力を削除して別のファイルにリダイレクトできます。

行末のスペースの数と一致し、その後に2015年以前のスペースが続く場合は、一致全体を「2015」に置き換えます。

別の可能性は次のとおりです。

sed -e 's/^\([[:digit:]]\{6\}\).\+\([[:digit:]]\{4\}\)$/\1 \2/'  names.txt

行の先頭の6つの数字と行の終わりの4つの数字を一致させ、それらの間にスペースを入れて一致するものを印刷します。他の行は変更されていません。

答え2

私が好むのは、逆追跡を減らすために文字列の先頭に固定することです。拡張正規表現が好きなので、次を使用します。

sed -re 's/^([0-9]{6}) .*( 2015)$/\1\2/' names.txt

これは何のためであるか。

-r extended regexp
-e expression to follow
s substitute
^ beginning of line
( start subpattern
[0-9] a digit
{6} previous occurs exactly six times
) end subexpression
. any single character
* previous occurs zero or more times
$ end of line
\1 first subpattern
\2 second subpattern

関連情報