Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Shell脚本,用于翻译第三个单词,该单词在一行中由制表符分隔_Regex_Perl_Shell_Unix - Fatal编程技术网

Regex Shell脚本,用于翻译第三个单词,该单词在一行中由制表符分隔

Regex Shell脚本,用于翻译第三个单词,该单词在一行中由制表符分隔,regex,perl,shell,unix,Regex,Perl,Shell,Unix,有人能帮我写一个脚本来翻译每行的第三个单词吗?单词之间用制表符隔开 样本输入: Hello how Are You Iam Fine how about 样本输出: Hello how Ziv You Iam Fine sld about 每行中的第三个单词应该翻译成:tr'[abcdefghijklmnopqrstuvqxyz]'[zyxwvutsrqponmlkjihgfedcba]'这非常笨拙,但可以完成任务(在bash shell中)。它在整个输入文件上使用sed的y音译操作符。这通

有人能帮我写一个脚本来翻译每行的第三个单词吗?单词之间用制表符隔开

样本输入:

Hello how Are You
Iam Fine how about
样本输出:

Hello how Ziv You
Iam Fine sld about

每行中的第三个单词应该翻译成:
tr'[abcdefghijklmnopqrstuvqxyz]'[zyxwvutsrqponmlkjihgfedcba]'

这非常笨拙,但可以完成任务(在bash shell中)。它在整个输入文件上使用sed的
y
音译操作符。这通过进程替换传递给awk和存储在数组中的第三个字段。然后,Awk循环遍历原始文件,并用音译值替换第三个字段的每个实例

awk -F'\t'  -v OFS='\t' 'NR == FNR{a[NR]=$3; next};{$3=a[FNR]; print}' \
<(sed -e 'y/abcdefghijklmnopqrstuvqxyz/zyxwvutsrqponmlkjihgfedcba/' \
-e 'y/ABCDEFGHIJKLMNOPQRSTUVQXYZ/ZYXWVUTSRQPONMLKJIHGFEDCBA/' file) file
awk-F'\t'-vofs='\t'-NR==FNR{a[NR]=3;next};{$3=a[FNR];print}'\
只是猛击一下:

#!/bin/bash
while read -ra A; do
    printf "%s\t%s" "${A[0]}" "${A[1]}"
    printf "\t%s" "$(echo "${A[2]}" | tr '[ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz]' '[ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba]')" "${A[@]:3}"
    echo
done
运行方式:

bash script.sh < input_file
如果将
\t
更改为空格(
):

另一个版本:

#!/bin/bash
F=({A..Z} {a..z}) R=({Z..A} {z..a})
while read -ra A; do
    printf "%s\t%s" "${A[0]}" "${A[1]}"
    printf "\t%s" "$(IFS=''; echo "${A[2]}" | tr "[${F[*]}]" "[${R[*]}]")" "${A[@]:3}"
    echo
done
鉴于以下情况:

[somedude@dev7 ~]# cat so.txt 
Hello   how Are You
Iam Fine    how about
[somedude@dev7 ~]# 
我会跑:

[somedude@dev7 ~]# cat so.sh 
#!/bin/bash

_INPUT="Hello how Are You
Iam Fine how about"

# read each line from config file
while read -r l 
do

  _GET_THIRD_WORD=$(echo $l | awk '{print $3}')

  echo $_GET_THIRD_WORD | sed -i "s,$_GET_THIRD_WORD,SOMETHINGTOTRANSLATEWITH," 

done < so.txt
[somedude@dev7 ~]# 
[somedude@dev7~]#猫苏
#!/bin/bash
_INPUT=“你好,你好吗
我很好,“怎么样?”
#从配置文件中读取每一行
而read-rl
做
_GET_THIRD_WORD=$(echo$l|awk'{print$3}')
echo$\u GET\u THIRD\u WORD | sed-i,$\u GET\u THIRD\u WORD,一些需要翻译的东西,“
done
这将把您翻译的每一行代码回送到标准输出


希望这有帮助

AWK脚本类似这样的内容

perl -F'\t' -lane '$F[3] =~ tr/ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz/ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba/ ; print "@F"' Filename
#!/usr/bin/awk -f
BEGIN{
    IFS="\t"                                        #input field separator as tab
    CHARSET = "abcdefghijklmnopqrstuvwxyz"      
}

{
    rep_str=""                                      #replacement string
    # loop in through each char of third word
    for(i=1;i<=length($3);i++){
        char = substr($3,i,1)
        loc = index(CHARSET,tolower(char))

        #check to see if the character is actually an alphabet
        if(loc>0){

            #get the reverse location of char in the CHARSET                               
            rep_char = substr(CHARSET,27-loc,1)    

            #change the replacement character to upper case if the original char is uppercase
            if(char~/[A-Z]/){
                rep_char = toupper(rep_char)   
            }
        }else{
            rep_char = char
        }
        rep_str=rep_str rep_char                       #final replacement sting formed by concatenation of replaced char rep_char 
    }
    $3 = rep_str                                           
    print $0    
}
#/usr/bin/awk-f
开始{
IFS=“\t”#输入字段分隔符作为选项卡
CHARSET=“abcdefghijklmnopqrstuvxyz”
}
{
rep_str=”“#替换字符串
#循环第三个单词的每个字符
对于(i=1;i0){
#获取字符集中字符的反向位置
rep_char=substr(字符集,27 loc,1)
#如果原始字符为大写,则将替换字符更改为大写
if(char~/[A-Z]/){
rep_char=toupper(rep_char)
}
}否则{
rep_char=char
}
rep_str=rep_str rep_char#由替换的char rep#char串联形成的最终替换sting
}
$3=rep_str
打印$0
}

获取错误:awk-F'\t'-vofs='\t''NR==FNR{a[NR]=$3;next};{$3=a[FNR];print}“\>-e”y/ABCDEFGHIJKLMNOPQRSTUVQXYZ/zyxwwvutsrqponmljihgfedcba/”MPACTS)MPACTS awk:1行附近的语法错误awk:bailing靠近1行sed:command-garbled:y/abcdefghijklmnopqrstuvxyz/zyxwvutsrqponmljihgfedcba/MPACTSGetng错误:bash script.sh问题中的拼写错误似乎已经渗透到你和所有其他答案中。我不想在
tr
表达式中拼写出整个字母表,我想我应该这样做以提高可靠性:
fwd=$(eval“echo{a..z}{a..z}”);rev=$(eval“echo{z..a}{z..a}”)
那么tr表达式可以是
tr“[${fwd//}]”“[${rev//}]”
@digitaltrampion,尽管您不再需要使用eval,例如
rev=$(echo{a..z}{a..z})
。另外,我更喜欢使用数组。请参阅我的编辑。我记得我在编写这个脚本时尝试了
{a..z}
(因为我不想手动键入a-z a-z),但我不确定当时它是如何工作的。哦,是的,数组方法肯定更优雅,不过我认为你需要最近的一次狂欢。它可以在4.2.25上使用,但不能在3.00.15上使用。@DigitalTrampion Brace扩展可以在3.0上使用,并且阵列至少从2.05b开始就已经存在。
$F[2]
。这是要更改的第三个单词,perl数组是零基的。看起来这里有一个输入错误-第二个
q
而不是
w
-或者这是故意的?
perl -F'\t' -lane '$F[3] =~ tr/ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz/ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba/ ; print "@F"' Filename
#!/usr/bin/awk -f
BEGIN{
    IFS="\t"                                        #input field separator as tab
    CHARSET = "abcdefghijklmnopqrstuvwxyz"      
}

{
    rep_str=""                                      #replacement string
    # loop in through each char of third word
    for(i=1;i<=length($3);i++){
        char = substr($3,i,1)
        loc = index(CHARSET,tolower(char))

        #check to see if the character is actually an alphabet
        if(loc>0){

            #get the reverse location of char in the CHARSET                               
            rep_char = substr(CHARSET,27-loc,1)    

            #change the replacement character to upper case if the original char is uppercase
            if(char~/[A-Z]/){
                rep_char = toupper(rep_char)   
            }
        }else{
            rep_char = char
        }
        rep_str=rep_str rep_char                       #final replacement sting formed by concatenation of replaced char rep_char 
    }
    $3 = rep_str                                           
    print $0    
}