bash:ファイル内の指定された場所に文字を挿入する

bash:ファイル内の指定された場所に文字を挿入する

次のファイルがあるとしましょう。

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を含む、sed4.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

X2番目のフィールドの先頭に挿入します。 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

関連情報