各行の形式は次のとおりです。 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