
次のファイルがあるとしましょう。
word1 something blabla
anotherword somethingelse asdf
yetanother else 123
各行に対して、2番目の列の前にコメントを追加する必要があります。このコメントは常に位置15で始まります(たとえば、#
位置15に挿入されます)。どうすればいいですか?
答え1
そのオプションsed
がGNUまたは互換性があると仮定¶-r
sed -r -e 's/^.{15}/&#/' file
明らかにする
word1 #something blabla
anotherword #somethingelse asdf
yetanother #else 123
1これは拡張正規表現サポートのためのものです。他のほとんどの人はこれをsed
サポートしています-E
(バージョン4.2のGNUを含む、sed
4.3までは文書化されていませんが、この回答が最初に書かれてからずっと後に公開されました)。これは現在POSIX規格の2023バージョンにあるためです。-E
/がない場合はを使用-r
します。\{...\}
{...}
答え2
別の解決策awk
:
awk '{$2="#"$2;print $0}' your_file
#
これは、表示される場所ごとに2番目の(スペースで区切られた)列の先頭に追加されます。
答え3
固定幅フィールドを使用するには、perl
's pack
/unpack
関数が便利です。
$ cat file
word 1 something blabla
anotherword somethingelse123asdf
yetanother else 123
$ perl -lne 'BEGIN {$format = "A15A16A*"}
@f = unpack$format;
$f[1] = "X$f[1]";
print pack $format, @f' file
word 1 Xsomething blabla
anotherword Xsomethingelse12asdf
yetanother Xelse 123
X
2番目のフィールドの先頭に挿入します。 2番目のフィールドの幅はまだ16バイトです。これは、2行目の場合は切り捨てられたことを意味します。
答え4
awkの答えはawk '{$2="#"$2;print $0}'
空白形式を再指定し、列の1つに空白文字が含まれている場合は失敗するため、正しくありません。
word1 something blabla
anotherword somethingelse asdf
yet another else 123
たとえば、次のようになります。
word1 #something blabla
anotherword #somethingelse asdf
yet #another else 123
正しいawkの答えは次のとおりです。
awk '{print substr($0,1,15) "#" substr($0,16) }'
出力は次のとおりです。
word1 #something blabla
anotherword #somethingelse asdf
yet another #else 123