我搜索了其他帖子,但未找到符合我需求的答案。我有一个空格分隔的文件。我想打印给定行中每个单词的第一个字母。例如:
cat test.txt
This is a test sentence.
使用sed,awk或组合,我希望输出为" Tiats"。有关指导我朝正确方向发展的建议吗?
答案 0 :(得分:4)
一种可能性:
pax> echo 'This is a test sentence.
This is another.' | sed -e 's/$/ /' -e 's/\([^ ]\)[^ ]* /\1/g' -e 's/^ *//'
Tiats
Tia
第一个sed
命令只是确保每行末尾有一个空格来简化第二个命令。
第二个命令将从每个单词中删除所有后续字母和尾随空格。这个意义上的一个词被定义为任何一组非空格字符。
第三个是添加的东西,以确保每行上的前导空格被删除。
答案 1 :(得分:4)
sed 的另一种解决方案:
sed 's/\(.\)[^ ]* */\1/g' File
在此,我们会查找any character
(.
),然后是sequence of non-space characters
([^ ]*
),然后是optional space
(*
)。将此模式替换为first
字符(与.
匹配的字符)。
<强>示例:强>
$ cat File
This is a test sentence.
Ahggsh Mathsh Dansdjksj
$ sed 's/\(.\)[^ ]* */\1/g' File
Tiats
AMD
答案 2 :(得分:2)
在awk中:
awk '{
for (i=1; i<=NF; i++) {
printf(substr($i, 1, 1));
}
printf("\n");
}' input_file
awk自动将NF设置为行中的字段数,循环遍历每个字段并使用substr
获取第一个字母
答案 3 :(得分:1)
一个有趣的纯Bash解决方案:
while read -r line; do
read -r -d '' -a ary <<< "$line"
printf '%c' "${ary[@]}" $'\n'
done < text.txt
答案 4 :(得分:0)
使用perl:
$ echo This is a test sentence | perl -nE 'print for /^\w|(?<=\W)./g'
Tiats
说明:打印任何非空白字符,该字符位于该行的开头,或以空格开头。
答案 5 :(得分:0)
另一个perl命令。
$ echo 'This is a test sentence.' | perl -nE 'print for m/(?<!\S)\S/g;print "\n"'
Tiats
答案 6 :(得分:0)
另一个awk
awk '{for (i=1;i<=NF;i++) $i=substr($i,1,1)}1' OFS= file
除了第一个字母之外,它会遍历每个单词并切除所有单词。
X:
cat file
This is a test sentence.
Ahggsh Mathsh Dansdjksj
awk '{for (i=1;i<=NF;i++) $i=substr($i,1,1)}1' OFS= file
Tiats
AMD
答案 7 :(得分:0)
sed 's/ *\([^ ]\)[^ ]\{1,\} */\1/g' YourFile
直接占据所有空间长度和位置。假设只是空格是空格字符而不是标签(但可以很容易地适应)
只是为了好玩
sed 's/ *\(\([^ ]\)\)\{1,\} */\2/g' YourFile
取最后一个字母而不是第一个字母
答案 8 :(得分:0)
在Haskell中,在一行:
main = putStr =<< (unlines . map (map head . words) . lines <$> getContents)
也许更可读:
main = do
line <- getLine --Read a single line from stdin
let allWords = words line --Turn the line into a list of words
let firsts = map head allWords --Get the first letter of each word
putStrLn firsts --Print them out
main --Start over
答案 9 :(得分:0)
这可能适合你(GNU sed):
sed 's/\B.\|[[:space:][:punct:]]//g' file
删除单词,空格和标点符号开头后的所有字符。
答案 10 :(得分:0)
啊,在我找到这个线程之前,任务非常艰巨。 ...我想提取一串单词中的第一个字母。这有效:
echo 'Apple banana Carrot fruit-cake (Grapes)' | sed -r 's/.*/\L&/; s/-/ /g; s/[()]//g; s/(.)[^ ]* */\1/g'
abcfcg
即
sed -r 's/.*/\L&/; s/-/ /g; s/[()]//g; s/(.)[^ ]* */\1/g'
\L&
将字符串小写(要大写,请使用:\U&
)-
()
(.)
[^ ]*
*
(.)
匹配]:\1