awk
/を使用して、文字列から最初と最後の文字を取り除くのはかなり簡単sed
ですか?
この文字列があるとします
( 1 2 3 4 5 6 7 )
括弧を削除したいと思います。
どうすればいいですか?
セドウェイ
$ echo '( 1 2 3 4 5 6 7 )' | sed 's/^.\(.*\).$/\1/'
1 2 3 4 5 6 7
ウェイクウェイ
$ echo '( 1 2 3 4 5 6 7 )' | awk '{print substr($0, 2, length($0) - 2)}'
1 2 3 4 5 6 7
POSIXの方法
$ var='( 1 2 3 4 5 6 7 )'; var="${var#?}"; var="${var%?}"; echo "$var"
1 2 3 4 5 6 7
バッシュウェイ
$ var='( 1 2 3 4 5 6 7 )'; echo "${var:1: -1}"
1 2 3 4 5 6 7
使用する場合bash
は、bash の方法を使用します。
そうでない場合は、posix-sh の方法をお勧めします。sed
読み込みやよりも高速ですawk
。
それ以外にも、これと組み合わせることができる他のテキスト処理を行っている可能性があるため、スクリプトの残りの部分によっては、sed
またはawk
最終的に使用するメリットがあります。
なぜこれが機能しないのですか?
sed '..' s_res.temp > s_res.temp
?
>
リダイレクトによってファイルが読み取られる前に切り捨てられるため、これは機能しません。これを解決するには、いくつかの選択肢があります。
本当にやりたいことは、ファイルを編集することです。ファイルエディタではなくsed
ストリームエディタです。
ed
ただし、ファイル エディターです (標準のエディターも!)。したがって、次を使用しますed
。
$ printf '%s\n' "%s/^.\(.*\).$/\1/" "." "wq" | ed s_res.temp
一時ファイルを使用しmv
てから、古いファイルを置き換えます。
$ sed 's/^.\(.*\).$/\1/' s_res.temp > s_res.temp.temp
$ mv s_res.temp.temp s_res.temp
-i
のオプションを使用しますsed
。これは、 POSIX および GNU のみで-i
はなく、GNU-sed でのみ機能します。
$ sed -i 's/^.\(.*\).$/\1/' s_res.temp
シェルを悪用します (あまりお勧めしません):
$ (rm test; sed 's/XXX/printf/' > test) < test
Mac OS X (最新バージョン 10.12 - Sierra) では、かなり古いbash
バージョンに固執しています。上記が機能するために必要な置換を含むバージョンを使用して3.2.57
いつでもインストールして取得できます。bash
brew
4.x
bash-hackers wikiでコンパイルされた、bash のバージョンとそれぞれの変更点のコレクションがあります。
特定の文字列から最初と最後の文字を削除するには、次のようにしますsed
。
sed -e 's/^.//' -e 's/.$//'
# ^^ ^^
# first char last char
例を参照してください。
sed -e 's/^.//' -e 's/.$//' <<< "(1 2 3 4 5 6 7)"
1 2 3 4 5 6 7
また、perl の方法:
perl -pe 's/^.|.$//g'