なしでsed
またはawk
を使用した場合、 only cut
、フィールド数が不明な場合、または行ごとに変化する場合に最後のフィールドを取得する方法
あなたはこのようなことを試すことができます:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
説明
moc.elgoog.spam
になりますcut
は区切り文字としてドットを使用し、最初のフィールドを選択します。これはmoc
です。com
を取得するために、もう一度それを元に戻します(リマインダーのおかげで、@ tom)。パラメータ展開を使用してください。これは、cut
(またはgrep
)を含むあらゆる種類の外部コマンドよりはるかに効率的です。
data=foo,bar,baz,qux
last=${data##*,}
Bashでのネイティブ文字列操作の概要については、 BashFAQ#100 を参照してください。
cut
だけでは不可能です。これはgrep
を使う方法です:
grep -o '[^,]*$'
他の区切り文字のコンマを置き換えます。
Awkがなければ... ...しかしawkを使えばとても簡単です。
echo 'maps.google.com' | awk -F. '{print $NF}'
AWKはあなたのポケットの中に持っているより強力なツールです。フィールドセパレータNFがフィールド数である場合は-F(最後のインデックスも表します)
複数の方法があります。あなたもこれを使うことができます。
echo "Your string here"| tr ' ' '\n' | tail -n1
> here
明らかに、trコマンドに入力された空白はあなたが必要とする区切り文字に置き換えられるべきです。
これはcut以外に何も使わないための唯一の解決策です:
echo "s.t.r.i.n.g." | cut -d '。' -f2- [repeat_following_part_forever_or_until_out_of_memory:] | cut -d '。' -f2-
この解決法を使用すると、フィールドの数は実際には未知であり、そして時々刻々変化することがある。ただし、行の長さは改行文字を含むLINE_MAX文字またはフィールドを超えてはならないため、このソリューションの実際の条件として、任意の数のフィールドが含まれることはありません。
はい、非常に愚かな解決策ですが、私が考える基準を満たす唯一のものです。
以下の道具 友達の提案
#!/bin/bash
rcut(){
nu="$( echo $1 | cut -d"$DELIM" -f 2- )"
if [ "$nu" != "$1" ]
then
rcut "$nu"
else
echo "$nu"
fi
}
$ export DELIM=.
$ rcut a.b.c.d
d
次のようなリストパスであるfilelist.txtという名前のファイルがあるとします。c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h
その後、これを行うことができます。rev filelist.txt | cut -d "/" -f1 |回転
入力文字列にスラッシュが含まれていない場合は、basename
とサブシェルを使用できます。
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
これはsed
もawk
も使いませんが、またcut
も使いませんので、それが質問に対する答えとしてふさわしいかどうかはよくわかりません。
スラッシュを含む可能性がある入力文字列を処理する場合、これはうまく機能しません。その場合の回避策は、スラッシュを、有効な入力文字列の一部ではないことがわかっている他の文字に置き換えることです。たとえば、パイプ(|
)文字もファイル名には使用できないので、これは機能します。
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
この古い質問へのアプローチを追加するためには、次のようにします。
$ cat input.file # file containing input that needs to be processed
a;b;c;d;e
1;2;3;4;5
no delimiter here
124;adsf;15454
foo;bar;is;null;info
$ cat tmp.sh # showing off the script to do the job
#!/bin/bash
delim=';'
while read -r line; do
while [[ "$line" =~ "$delim" ]]; do
line=$(cut -d"$delim" -f 2- <<<"$line")
done
echo "$line"
done < input.file
$ ./tmp.sh # output of above script/processed input file
e
5
no delimiter here
15454
info
Bash以外にはcutだけが使われています。さて、そしてエコー、私は思います。
末尾の区切り文字が存在することを確認すれば、うまくいきます。だから私の場合私はカンマと空白の区切り記号があります。最後にスペースを入れます。 $ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b