У меня есть класс Java, который содержит такие поля:
private int port;
private String portName;
private ArrayList portList;
private int id;
Мне нужна команда или сценарий, чтобы я мог напрямую вставить вышеуказанный блок в терминал и передать его в качестве входных данных для этой команды или сценария и дать мне следующий вывод:
public String toString() {
return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}
Онлайнер, использующий awk
(т. Е. GNU Awk):
awk 'BEGIN{printf"public String toString() {\n return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}'
Используйте его следующим образом:
$ awk 'BEGIN{printf"public String toString() {\n return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}' <<EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}
#!/usr/bin/awk -f
# do the following before processing the text
BEGIN {
# print this text, '\n' is a line break and '\"' a literal '"'
printf "public String toString() {\n return \"{ \""
}
{
# remove semicolon at the end of the line
gsub(";$","");
# print ' + "'
printf " + \"";
# if the line number is > 1 print ','
if (NR > 1) { printf "," };
# print the third row followed by '=" + ' and the third row again
printf $3"=\" + "$3
}
# do the following after processing the text
END {
# print ' + "}";\n}', '\n' is a line break
print " + \"}\";\n}"
}
Сохраните как generate_toString
, сделайте его исполняемым с chmod +x generate_toString
и используйте его следующим образом:
$ ./generate_toString <<EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}
Хотя это и делает то, что вы просили, для решения вашей реальной проблемы есть далеко лучшие подходы см. @DavidFoerster , а также комментарий @nickb выше. Нет необходимости изобретать велосипед.
Я думаю, это то, что вы хотите.
#!/bin/bash
# Create Java toString() method from stdin.
while read line; do
word_last="${line##* }"
name="${word_last%;}"
if [[ $pairs ]]; then
printf -v pair '",%s=" + %s + ' "$name" "$name"
else
printf -v pair '"%s=" + %s + ' "$name" "$name"
fi
pairs+="$pair"
done
printf '%s\n' 'public String toString() {'
printf ' return "{ " + %s"}";\n' "$pairs"
printf '%s\n' '}'
Звоните так:
$ bash create_java_toString.sh << EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}
Больше примеров:
$ bash create_java_toString.sh << EOF
> private int i;
> private int j;
> EOF
public String toString() {
return "{ " + "i=" + i + ",j=" + j + "}";
}
$ bash create_java_toString.sh << EOF
> EOF
public String toString() {
return "{ " + "}";
}
Я не знаю, как вы собираетесь использовать эти сценарии, но это должно привести вас в правильном направлении:
#!/usr/bin/env bash
# get the argumetenst from the command line
# Sample terminal usage
# tostring -p port -n portName -l portLiat -i id
echo ""
echo ""
while getopts :p:n:l:i: option
do
case "${option}" in
p) port=${OPTARG};;
n) portName=${OPTARG};;
l) portList=${OPTARG};;
i) id=${OPTARG};;
\?)
echo ""
echo -e "\e[0;31m Please supply the required values: $OPTARG \e[0m" 1>&2
echo ""
echo " Usage: tostring -p port -n portName -l portList -i id"
echo ""
exit 1
;;
: )
echo "Invalid option $OPTARG requires an argument" 1>&2
;;
esac
done
shift $((OPTIND -1))
echo ""
echo ""
echo -e "\e[0;33m public String toString() {"
echo -e " return "{ " + "port=" + "$port" + ",portName=" + "$portName" + ",portList=" + "$portList" + ",id=" + "$id" "}";"
echo ""
echo ""
echo -e "}"
echo -e "\e[0m"
Дополнительная информация:
https: // sookocheff.com/post/bash/parsing-bash-script-arguments-with-shopts/