0

ファイル名のサフィックスを削除する簡単な方法はありますか? 問題は、私の接尾辞の長さが異なることです。filename の同じ文字列のみが _L001 です。

例を参照してください。

NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3

_L001 の前にすべてを出力する必要があります。

NAME-code_code2
NAME-code
NAME-code_code2_code3

私はこのようなことを考えていました(サフィックスが固定長の場合):

echo NAME-code_code2_L001_sufix | rev | cut -c 12- | rev

もちろん、私の接尾辞の長さはさまざまです。bash または awk ソリューションはありますか?

ありがとうございました。

4

6 に答える 6

4

純粋な文字列操作技術の使用:-

$ string="NAME-code_code2_L001_sufix"; printf "%s\n" "${string%_L001*}"
NAME-code_code2

ファイル内のすべての行について、bashファイルをメモリ内で読み取り、抽出を実行することで、同じことができます

# Setting a variable to the contents of a file using 'command-substitution'
$ mystringfile="$(<stringfile)"                 

# Read the new-line de-limited string into a bash-array for per-element operation
$ IFS=$'\n' read -d '' -ra inputArray <<< "$mystringfile"

# Run the sub-string extraction for each entry in the array
$ for eachString in "${inputArray[@]}"; do printf "%s\n" "${eachString%_L001*}"; done

NAME-code_code2
NAME-code
NAME-code_code2_code3

printfforループ内を次のように変更することにより、内容を新しいファイルに書き込むことができます

printf "%s\n" "${eachString%_L001*}" >> output-file
于 2016-10-06T11:52:09.737 に答える
2

_L001awk でフィールド区切りとして使用し、最初のフィールドを出力できます。

awk -F '_L001' '{print $1}' file

NAME-code_code2
NAME-code
NAME-code_code2_code3
于 2016-10-06T11:52:00.387 に答える
1

これを行う多くの方法:

# Here is your Input text.
bash$> cat a.txt
NAME-code_code2_L001_sufix
NAME-code_L001_sufix_sufix2_sufix3
NAME-code_code2_code3_L001_sufix_sufix2_sufix3
bash$>

# Desired output using perl.
bash$> cat a.txt |perl -nle 'if (/^(.+)_L.*$/){print $1}'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>

# Desired output using sed.
bash$> cat a.txt |sed 's#\(.*\)_L001_.*#\1#g'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>

# Desired output using cut
bash$> cat a.txt |cut -f1 -d "L"|sed 's/_$//g'
NAME-code_code2
NAME-code
NAME-code_code2_code3
bash$>
于 2016-10-06T14:03:07.950 に答える
1

解決策は次のとおりgrepです。これにより、最初から表示されるまで行が出力され_L001ます。

grep -oP '^.*?(?=_L001)' inputfile
NAME-code_code2
NAME-code
NAME-code_code2_code3
于 2016-10-06T12:33:41.707 に答える
1

次のような文字列置換を使用することもできます。

for i in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3
do
    echo ${i%_L001*}
done
于 2016-10-06T14:07:30.720 に答える
1

私はsedを提案します。

sed 's|\(.*\)_L001.*|\1|'

例:

$ for LINE in NAME-code_code2_L001_sufix NAME-code_L001_sufix_sufix2_sufix3 NAME-code_code2_code3_L001_sufix_sufix2_sufix3; do echo "$LINE"|sed 's|\(.*\)_L001.*|\1|';done
NAME-code_code2
NAME-code
NAME-code_code2_code3
于 2016-10-06T11:50:21.343 に答える