※当サイトの記事には、広告・プロモーションが含まれます。

Linuxで文字列の末尾の改行を無くしたいだけが、想像以上に困難という...

japan.zdnet.com

 KDDIは、5G対応基地局の全国展開を急ピッチで進めており、基地局や通信施設の設備の監視による障害の検知・保守は、極めて重要な業務の一つという。同社では、全国各地の通信施設を常時監視し、設備障害時は業務委託先が全国数万カ所の基地局に即座に駆け付けて、機器交換などの故障対応を速やかに行っている。

KDDI、通信設備の故障対応業務にCelonisを導入 - ZDNET Japan

 しかし、故障対応の業務プロセスが複雑化して、一部に非効率な部分があったとのこと。そこで業務改善プロジェクトを立ち上げて要因を調べた結果、新サービスや設備導入に伴う現場担当者の創意工夫が結果的に業務を複雑化、非効率化させていたことが判明。これにより業務プロセスを可視化して、変更に気付く仕組みの導入を判断し、Celonisを導入した。

KDDI、通信設備の故障対応業務にCelonisを導入 - ZDNET Japan

⇧ 悲しいとき~、頑張ったことの全部が裏目に出た時~。

とは言っても、他に代替案となる選択肢が無ければ、今あるものでやり繰りするしかないので、難しい問題ですね。

試行錯誤してデータが集まってみないと分からないことあるあるだと思いますし。

Linuxで文字列の末尾の改行を無くしたいだけが、想像以上に困難という...

最初、軽く考えていたんだけど、調べれば調べるほど、解決策が無いんじゃないのか、という気がしてきましたと。

そもそも、改行を実現するのが、改行コードだと思うのですが、

qiita.com

⇧ 上記サイト様にありますように、改行コードの種類が複数あるんだわさ~。

お察しの通り、ファイルシステムが絡んでくるもんだから、「OS(Operation System)」の影響を受けますと。

とりあえず、今回の目的は、『文字列の末尾の改行を無くしたいだけ』なので、改行コードの種類の判定とかは一切考慮せず、

tech.kurojica.com

ja.linux-console.net

rurukblog.com

⇧ 上記サイト様にありますように、改行コードが何であろうと問答無用で除去するという方針で行くことにしました。

改行コードについては、

developers-book.com

papiro.hatenablog.jp

⇧ 上記サイト様によりますと、「od」コマンドで可視化できるっぽいですと。

で、試してみました。

■/home/ts0818/work/test_rm_end_of_str/test_rm_end_of_str.sh

#!/bin/bash

STR_LAST_CR="str_last_cr\r"
STR_LAST_LF="str_last_lf\n"
STR_LAST_CRLF="str_last_crlf\r\n"

# 改行コードを有効にする
STR_LAST_CR=$(echo -e "${STR_LAST_CR}")
STR_LAST_LF=$(echo -e "${STR_LAST_LF}")
STR_LAST_CRLF=$(echo -e "${STR_LAST_CRLF}")

echo "before remove the end of string"
echo '${STR_LAST_CR}\t'"${STR_LAST_CR}" | od -c
echo '${STR_LAST_LF}\t'"${STR_LAST_LF}" | od -c
echo '${STR_LAST_CRLF}\t'"${STR_LAST_CRLF}" | od -c

echo "execute remove the end of string"
echo "use sed -e"
echo '${STR_LAST_CR}\t'"${STR_LAST_CR}" | sed -e "s/[\r\n]\+//g" | od -c
echo '${STR_LAST_LF}\t'"${STR_LAST_LF}" | sed -e "s/[\r\n]\+//g" | od -c
echo '${STR_LAST_CRLF}\t'"${STR_LAST_CRLF}" | sed -e "s/[\r\n]\+//g" | od -c

echo "use sed -z"
echo '${STR_LAST_CR}\t'"${STR_LAST_CR}" | sed -z "s/[\r\n]\+//g" | od -c
echo '${STR_LAST_LF}\t'"${STR_LAST_LF}" | sed -z "s/[\r\n]\+//g" | od -c
echo '${STR_LAST_CRLF}\t'"${STR_LAST_CRLF}" | sed -z "s/[\r\n]\+//g" | od -c

echo "awk"
echo '${STR_LAST_CR}\t'"${STR_LAST_CR}" | awk '{printf $0}' | od -c
echo '${STR_LAST_LF}\t'"${STR_LAST_LF}" | awk '{printf $0}' | od -c
echo '${STR_LAST_CRLF}\t'"{$STR_LAST_CRLF}" | awk '{printf $0}' | od -c

echo "use tr"
echo '${STR_LAST_CR}\t'"${STR_LAST_CR}" | tr -d '\r\n' | od -c
echo '${STR_LAST_LF}\t'"${STR_LAST_LF}" | tr -d '\r\n' | od -c
echo '${STR_LAST_CRLF}\t'"${STR_LAST_CRLF}" | tr -d '\r\n' | od -c

⇧ で分かり辛いのだけど、「CR」「LF」「CRLF」の3種類の改行コードを確認してます。

orebibou.com

qiita.com

⇧ 上記サイト様によりますと、echoのeオプションは、バックスラッシュ付きの文字をエスケープシーケンスとして認識してくれるらしい。

ちなみに、man echoした結果が以下。

ECHO(1)                      User Commands                     ECHO(1)

NAME
       echo - display a line of text

SYNOPSIS
       echo [SHORT-OPTION]... [STRING]...
       echo LONG-OPTION

DESCRIPTION
       Echo the STRING(s) to standard output.

       -n     do not output the trailing newline

       -e     enable interpretation of backslash escapes

       -E     disable interpretation of backslash escapes (default)

       --help display this help and exit

       --version
              output version information and exit

       If -e is in effect, the following sequences are recognized:

       \\     backslash

       \a     alert (BEL)

       \b     backspace

       \c     produce no further output

       \e     escape

       \f     form feed

       \n     new line

       \r     carriage return

       \t     horizontal tab

       \v     vertical tab

       \0NNN  byte with octal value NNN (1 to 3 digits)

       \xHH   byte with hexadecimal value HH (1 to 2 digits)

       NOTE:  your  shell may have its own version of echo, which usu‐
       ally supersedes the version described here.   Please  refer  to
       your  shell's  documentation  for  details about the options it
       supports.

AUTHOR
       Written by Brian Fox and Chet Ramey.

REPORTING BUGS
       GNU coreutils online help:  <https://www.gnu.org/software/core‐
       utils/>
       Report   any   translation   bugs  to  <https://translationpro‐
       ject.org/team/>

COPYRIGHT
       Copyright  ©  2020  Free  Software  Foundation,  Inc.   License
       GPLv3+:   GNU  GPL  version  3  or  later  <https://gnu.org/li‐
       censes/gpl.html>.
       This is free software: you are free to change and  redistribute
       it.  There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
       Full      documentation     <https://www.gnu.org/software/core‐
       utils/echo>
       or available locally via: info '(coreutils) echo invocation'

GNU coreutils 8.32           February 2022                     ECHO(1)

⇧『-e enable interpretation of backslash escapes』という説明になってますな。

エスケープシーケンス」はと言うと、

エスケープシーケンス (escape sequence) とは、コンピュータシステムにおいて、通常の文字列では表せない特殊な文字や機能を、規定された特別な文字の並びにより表したもの。

エスケープシーケンス - Wikipedia

具体例

代表的なものに、C言語の文字列リテラル中でバックスラッシュ(\、U+005C)で始めることで改行コードなどを表現するものや、エスケープコード (U+001B, ESC) で始めるISO/IEC 2022 (JIS X 0202) における文字集合の指示・呼び出しのシーケンス(漢字シフトコードも参照)や、ISO/IEC 6429 (ECMA-48、JIS X 0211) の画面制御シーケンス(いわゆる「ANSIエスケープシーケンス英語版」)がある。

エスケープシーケンス - Wikipedia

⇧ ということですと。

脱線しましたが、実行すると、

⇧ 見た感じ、-zオプション付けたsedコマンドとtrコマンド以外は、中途半端な感じになってるっぽい...

ちなみに、awkの結果を見るに、改行コードの削除が完全にできていないようなので、

qiita.com

⇧ 上記サイト様で仰っているのは、「\n」限定の話ってことっぽいのかな。

う~む、結局、どうすれば良いかよく分からん...

改行コードが「\n」だけを考慮するだけで良いんであれば、シンプルな話になるとは思うんだけど...

「CR」「LF」「CRLF」の3種類の改行コードすべてに対応するってなると、途端に情報が無くなるんよな...

まぁ、流石に、「CR」の改行コードについては考慮が不要になってくる気はしますけど。

毎度モヤモヤ感が半端ない...

今回はこのへんで。